今天没怎么学习,简单写下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表示主键的时候,主键不能是组合列索引。