写在前面:
网上针对索引分类,各种定义混乱,现在针对索引分类做以下整理。不足的地方,欢迎大家指正。
在MySql中,索引是在存储引擎层而不是服务器层实现的。
一、索引类型分类:
1. B-Tree索引
相关定义及原理
B-Tree树索引通常意味着所有的值都是按顺序存储的,并且每一个叶子页到根的距离都是相同。
B-Tree树索引能够加快访问速度,因存储引擎不必进行全表扫描获取数据,而是从索引的根节点开始搜索。根节点的槽中存放了指向子节点的指针,存储引擎根据这些指针向下层查找。 通过比较节点页的值和要查找的值可以找到合适的指针进入下层子节点,这些指针实际上定义了子节点页中值得上限和下限。最终存储引擎要么找到对应的值,要么该记录不存在。
树的深度跟表的大小直接相关。
可使用B-tree索引的类型
适用类型:全键值、键值范围、键前缀【只适用最左前缀,这是Mysql相关特性,甚至和版本有关】
因为索引树中节点是有序的,故可按键值查找、ORDER BY顺序查找。
B-Tree索引限制
- 没有按照索引的最左前缀查找
- 不能跳过索引的列
- 某个列范围查找,则右边所有列都无法使用索引查找。如下方案例:
WHERE name='zhangsan' AND city LIKE 'shen%' AND `date` ='2019-12-07'
2. 哈希索引
哈希索引基于哈希表实现,只有精确匹配索引所有列的查询才有效。
每一行,存储引擎都会对所有列计算一个哈希码,哈希码是较小的值,并且不同键值的行计算出来的哈希码也不一样。
在MySql中,只有Memory引擎显示支持哈希索引。也是Memory的默认索引类型,同时也支持B-Tree索引。
Memory引擎支持非唯一索引。
哈希索引限制
- 哈希索引只包含值和行指针,而不存储字段值,故不能使用索引中的值来避免读取行。
- 哈希索引无法用于排序,因哈希索引不是按照索引顺序存储。
- 哈希索引不支持部分索引匹配查找,因哈希索引始终是使用索引列的全部内容来计算哈希值。
3. 全文索引
通过关键字匹配来进行查询过滤,基于相似度来查询。全文索引基本原理列斯互联网搜索引擎。
待进一步完善…
4. 空间索引
MyISAM表支持空间索引,可用于地理数据存储。
二、索引优点
1. B-Tree索引三大优点:
索引大大减少服务器扫描的数据量
索引帮助服务器避免排序和临时表
索引可以减少随机I/O变为顺序I/O
2. 索引的“三星系统”
索引将相关记录放到一起则获得一星
索引中数据顺序和查找排序一直则获得二星
索引中列包含查询中需要的全部列则三星
3. 索引是否为最好的解决方案
非常小的表,大部分情况全表扫描更高效
中到大型表,索引非常有效
特大表【TB级别】,可使用分区技术,块级元数据技术替换索引
文末索引点缀
全值匹配我最爱,最左前缀要遵守;
带头大哥不能死,中间兄弟不能断;
索引列上少计算,范围之后全失效;
LIKE百分写最右,覆盖索引不写星;
不等空值还有or,索引失效要少用。