《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的存储结构总结

MySQL innodb引擎深入讲解

mysql数据库引擎innodb的主索引文件和表文件分开吗?如果不分开,那怎么查询?

MySQL数据库MyISAM和InnoDB存储引擎的对比

《MySQL系列-InnoDB引擎23》文件-InnoDB存储引擎文件-表空间文件

MySQL Index--InnoDB引擎的主键索引