☺
什么事索引
索引是存储引擎用于快速找到记录的一种数据结构
索引的分类
根据数据结构分为: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+,提高了区间访问性能