《MySQL系列-InnoDB引擎24》表-索引组织表
Posted DATA数据猿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《MySQL系列-InnoDB引擎24》表-索引组织表相关的知识,希望对你有一定的参考价值。
表
本章节从InnoDB存储引擎表的逻辑存储及实现开始进行介绍,然后将重点分析表的物理存储特征,即数据在表中是如何组织和存放的。简单来说,表就是关于特定实体的数据集合,这也是关系型数据库模型的核心。
索引组织表
在InnoDB存储引擎中,表都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表(index organized table)。在InnoDB存储引擎表中,每张表都有个主键(primary key),如果在创建表时没有显式的定义主键,则InnoDB存储引擎会按如下方式选择或创建主键:
- 首先判断表中是否有非空的唯一索引(unique not null),如果有,则该列即为主键。
- 如果不符合上述条件,InnoDB存储引擎自动创建一个6字节大小的指针。
当表中有多个非空唯一索引时,InnoDB存储引擎将选择建表时第一个定义的非空唯一索引作为主键。如下所示:
案例一:
# 1.创建表uniq,字段依次是a,b,c,d
# 索引顺序依次是b,c,d
mysql> create table uniq (
-> a int not null,
-> b int null,
-> c int not null,
-> d int not null,
-> unique key (b),
-> unique key (c),
-> unique key (d)
-> );
Query OK, 0 rows affected (0.14 sec)
# 2.插入数据
mysql> insert into uniq values(1,2,3,4),(5,6,7,8),(9,10,11,12);
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
# 3._rowid可以显示表的主键
mysql> select a,b,c,d,_rowid from uniq;
+---+------+----+----+--------+
| a | b | c | d | _rowid |
+---+------+----+----+--------+
| 1 | 2 | 3 | 4 | 3 |
| 5 | 6 | 7 | 8 | 7 |
| 9 | 10 | 11 | 12 | 11 |
+---+------+----+----+--------+
3 rows in set (0.00 sec)
案例二:
# 1.创建表uniq2,字段依次是a,b,c,d
# 索引依次是b,d,c
mysql> create table uniq2 (
-> 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 (0.06 sec)
# 2.插入数据
mysql> insert into uniq2 values(1,2,3,4),(5,6,7,8),(9,10,11,12);
Query OK, 3 rows affected (0.02 sec)
Records: 3 Duplicates: 0 Warnings: 0
# 3._rowid可以显示表的主键
mysql> select a,b,c,d,_rowid from uniq2;
+---+------+----+----+--------+
| 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.00 sec)
通过案例一和案例二结果对比,我们发现案例一的主键是字段c
,也就是在uniq表
中字段c
是第一个非空唯一索引
字段。案例二的主键是字段d
,也就是在uniq2表
中字段d
是第一个非空唯一索引
字段。两则建表语句中,字段顺序是相同的,但是索引的顺序是相同的。所以证实了主键的选择是根据定义索引的顺序,而不是建表时列的顺序
。
除此之外,需要注意的是通过_rowid
查看主键的方法,只适用于单列为主键的情况,比如:当多列作为主键时,就无法查询。
# 1.创建表uniq3,a,b作为联合主键
mysql> create table uniq3 (
-> a int ,
-> b int ,
-> primary key (a,b)
-> ) engine=InnoDB;
Query OK, 0 rows affected (0.04 sec)
# 2.插入顺序
mysql> insert into uniq3 values(1,1),(2,2);
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
# 3.查询主键失败
mysql> select a,b,_rowid from uniq3;
ERROR 1054 (42S22): Unknown column '_rowid' in 'field list'
以上是关于《MySQL系列-InnoDB引擎24》表-索引组织表的主要内容,如果未能解决你的问题,请参考以下文章
mysql数据库引擎innodb的主索引文件和表文件分开吗?如果不分开,那怎么查询?