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表示主键的时候,主键不能是组合列索引。

收藏 打印