MySQL 系列文 - 索引的相关知识(1) - 索引组织表

前言

不管用的是哪一种 RDBMS,相信大家都有听过索引,不外乎就是希望SQL语法可以跑得更有效率,针对 SELECT 的 WHERE 条件栏位添加索引。
关于索引的知识也非常广,不是一篇文章就可以说明完成,以下几个主题是我自己觉得蛮重要的,在这里纪录一下也分享给大家,会以系列文的方式撰写,这里都是以 InnoDB 引擎的角度去撰写。

索引组织表 (Index Organized Table)B+树索引何谓覆盖索引何谓複合索引何谓 ICP (Index Condition Pushdown)

索引组织表 (Index Organized Table)

到目前为止,MySQL 默认的储存引擎是 InnoDB(跟其他引擎有什么差异不在这里讨论),在 InnoDB 中 TABLE 都是依照 PK 顺序组织存放的,此种储存方式的 TABLE 就称为索引组织表。
因此每张 TABLE 都一定要有一个 PK,如果在建立 TABLE 的时候没有明确的指定 PK,那么 InnoDB 会主动选择或是创建一个 PK,也就是说一定要每张表都有 PK 的意思。选择的规则如下

判断 TABLE 中是否有 not null 的唯一索引,如果有,则该栏位就是PK如果不符合上述条件,InnoDB 就会自动创建一个 6 bytes 自动增长的 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 - 利用 _rowid
SELECT a, b, c, _rowid FROM test1
结果如下, _rowid 可以显示 TABLE 的 PK,可以发现 InnoDB 选了栏位 c 当 PK
http://img2.58codes.com/2024/20124671H8qEIZ8YCJ.png

方式 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 栏位
http://img2.58codes.com/2024/201246711rmglOvD4T.png


小结

本篇大概说明了一下何谓索引组织表,不过这些前提是使用的 InnoDB 储存引擎。后面会再说明最常见的B+树索引

资料库知识相当广泛,文中若有不正确的地方,也烦请各位大神不吝指教,谢谢


参考网站
Clustered and Secondary Indexes
https://dev.mysql.com/doc/refman/5.7/en/innodb-index-types.html


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章