首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL只索引组织表

MySQL只索引组织表

作者头像
AsiaYe
发布2019-11-06 16:12:44
1.4K0
发布2019-11-06 16:12:44
举报
文章被收录于专栏:DBA随笔DBA随笔
MySQL之索引组织表

今天没怎么学习,简单写下MySQL里面innodb存储引擎下的索引组织表吧。

在Innodb存储引擎中,表都是根据主键的顺序组织存放的,这种存储方式的表称之为索引组织表,在innodb存储引擎中,每张表都有主键,也就是primary key,如果在创建表的时候没有显式的制定主键,那么innodb存储引擎会根据如下规则帮助我们选择或者创建主键:

1.首先判断表中是否有飞空的唯一索引,如果有,则该列设置为主键;

2.如果没有,innodb存储引擎自动创建一个6字节大小的指针作为主键。

3.当我们的表中有多个唯一索引时,innodb存储引擎会选择建表时的第一个定义的非空索引作为主键,需要注意的是,主键的选择根据的是定义索引的顺序,而不是建表时的顺序。举个例子:

mysql> create table z(
    -> a int not null,
    -> b int null,
    -> c int not null,
    -> d int not null,
    -> unique key (b),
    -> unique key (d),
    -> unique key (c)
    -> );
Query OK, 0 rows affected (1.48 sec)

首先我们创建一张表,这张表包含a,b,c,d四个列b,c,d三个列上我们都创建了唯一索引,不同的是b的值可以为空,而c,d列都是唯一索引,而且不为空,上面的建表语句没有显式的定义主键,所以innodb存储引擎会帮我们自动选择非空的唯一索引,接着我们给这张表插入一些数据:

mysql> insert into z select 1,2,3,4;
Query OK, 1 row affected (0.13 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql>
mysql> insert into z select 5,6,7,8;
Query OK, 1 row affected (0.09 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql>
mysql> insert into z select 9,10,11,12
Query OK, 1 row affected (0.41 sec)
Records: 1  Duplicates: 0  Warnings: 0

然后我们通过下面这个SQL语句来判断表的主键值:

mysql> select a,b,c,d,_rowid from z;
+---+------+----+----+--------+
| a | b    | c  | d  | _rowid |
+---+------+----+----+--------+
| 1 |    2 |  3 |  4 |      4 |
| 5 |    6 |  7 |  8 |      8 |
| 9 |   10 | 11 | 12 |     12 |
+---+------+----+----+--------+
3 rows in set (0.02 sec)

其中,_rowid可以查看一个表的主键,可以看出虽然c,d都是非空唯一索引,但是在定义的过程中,unique key (d)比较靠前,所以innodb存储引擎将他作为这个表的主键。

另外需要注意的是,_rowid只能查看主键是单个列的情况,如果主键是一个组合列的主键,那这个参数就不能看了,我们举个例子:

mysql> create table zz(
    -> a int,
    -> b int,
    -> primary key (a,b)
    -> )engine = innodb;
Query OK, 0 rows affected (0.84 sec)

mysql> insert into zz select 1,1;
Query OK, 1 row affected (0.12 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> select a,_rowid from zz;
ERROR 1054 (42S22): Unknown column '_rowid' in 'field list'

可以看到,_rowid表示主键的时候,主键不能是组合列索引。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档