MySQL索引

什么事索引
索引是存储引擎用于快速找到记录的一种数据结构

索引的分类
根据数据结构分为:B+Tree索引、哈希索引、R-Tree索引、FULLTEXT索引
根据物理存储分为:聚簇索引、非聚簇索引
根据
根据逻辑角度分为:普通索引 INDEX、唯一索引/非唯一索引 UNIQUE、主键索引 PRIMARKY KEY、全文索引 FULLTEXT、组合索引

创建索引

1
ALTER TABLE `table_name` ADD INDEX index_name (`name`)   普通索引

最普通的索引,没有什么限制

1
ALTER TABLE `table_name` ADD UNQQUE (`name`)   唯一索引

索引列的值只允许有一个 允许为空

1
ALTER TABLE `table_name` ADD PRIMARKY KEY (`name`)  主键索引

不允许有空值

1
ALTER TABLE `table_name` ADD FULLTEXT (`name`)  全文索引

只用于MyISAM 表,针对较大的数据,比较消耗空间

1
ALTER TABLE `table_name` ADD INDEX index_name (`name1`,`name2`)  组合索引

遵循 最左前缀的规则

聚簇索引和非聚簇索引索引的区别
聚簇索引的叶子节点就是数据节点,非聚簇索引的叶子节点仍然是索引节点,有指向对应数据块的指针。

BTree 与 BTree-/BTree+ 索引原理
BTree
二叉树导致树高度非常高,逻辑上很近的节点,物理上非常远,无法利用局部性,IO 次数多,查找效率低

BTree-
每个节点都是二元数组[key,data],所有节点都可以存储数据,key 为索引,data 为索引外的数据。插入删除数据会破坏 BTree 性质,插入数据时候,需要对数据进行分裂、合并、转移等操作保持 BTree 性质,造成 IO 操作频繁

BTree+
非叶子节点不存储 data,只存储索引 key,只有叶子节点才存储 data

MySQL中的 BTree+
在经典 BTree+ 的基础上进行了优化,增加了顺序访问指针。在 BTree+ 的每个叶子节点增加了一个指向相邻叶子节点的指针,形成了带顺序访问指针的 BTree+,提高了区间访问性能