前言
不管用的是哪一种 RDBMS,相信大家都有听过索引,不外乎就是希望SQL语法可以跑得更有效率,针对 SELECT 的 WHERE 条件栏位添加索引。
关于索引的知识也非常广,不是一篇文章就可以说明完成,以下几个主题是我自己觉得蛮重要的,在这里纪录一下也分享给大家,会以系列文的方式撰写,这里都是以 InnoDB 引擎的角度去撰写。
索引组织表 (Index Organized Table)
到目前为止,MySQL 默认的储存引擎是 InnoDB(跟其他引擎有什么差异不在这里讨论),在 InnoDB 中 TABLE 都是依照 PK 顺序组织存放的,此种储存方式的 TABLE 就称为索引组织表。
因此每张 TABLE 都一定要有一个 PK,如果在建立 TABLE 的时候没有明确的指定 PK,那么 InnoDB 会主动选择或是创建一个 PK,也就是说一定要每张表都有 PK 的意思。选择的规则如下
★ 做个实验
首先建立一张 TABLE ,不要指定 PK。里面只有 c 栏位有建立唯一索引。
CREATE TABLE test1 ( a INT NOT NULL, b INT, c INT NOT NULL, UNIQUE KEY a1 (c) ); INSERT INTO test1 VALUES(1,2,3);
透过两个方式来看看到底哪个会是 PK
方式 1 - 利用 _rowidSELECT a, b, c, _rowid FROM test1
结果如下, _rowid 可以显示 TABLE 的 PK,可以发现 InnoDB 选了栏位 c 当 PK
方式 2 - 利用系统表
SELECT TABLE_SCHEMA, TABLE_NAME, GROUP_CONCAT(COLUMN_NAME) as pk_columnFROM information_schema.COLUMNSWHERE column_key = 'PRI'AND table_schema = 'test'AND table_name = 'test1';
结果如下,可以发现 PK 的确是选了 c 栏位
小结
本篇大概说明了一下何谓索引组织表,不过这些前提是使用的 InnoDB 储存引擎。后面会再说明最常见的B+树索引
资料库知识相当广泛,文中若有不正确的地方,也烦请各位大神不吝指教,谢谢
参考网站
Clustered and Secondary Indexes
https://dev.mysql.com/doc/refman/5.7/en/innodb-index-types.html