MySQL-索引结构

BTree索引

BTree(多路搜索树,并不是二叉的)是一种常见的数据结构。

不适合:

单列索引的列不能包含null的记录,复合索引的各个列不能包含同时为null的记录,否则会全表扫描;索引失效很多时候是因为这列有null,空值
不适合键值较少的列(重复数据较多的列);假如你建立了,会发生什么情况呢?查询反而会变慢
前导模糊查询不能利用索引(like ‘%XX’或者like ‘%XX%’),该类sql语句导致索引失效

Hash散列索引

Hash散列索引是根据HASH算法来构建的索引。

适合:

精确查找非常快(包括= <> 和in),其检索效率非常高,索引的检索可以一次定位,不像BTree 索引需要从根节点到枝节点,所以 Hash 索引的查询效率要远高于 B-Tree 索引。

不适合:

不适合模糊查询和范围查询(包括like,>,<,between……and等),由于 Hash 索引比较的是进行 Hash 运算之后的 Hash 值,所以它只能用于等值的过滤,不能用于基于范围的过滤,因为经过相应的 Hash 算法处理之后的 Hash 值的大小关系,并不能保证和Hash运算前完全一样;
不适合排序,数据库无法利用索引的数据来提升排序性能,同样是因为Hash值的大小不确定;
复合索引不能利用部分索引字段查询,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用。
同样不适合键值较少的列(重复值较多的列);

Bitmap位图索引

就是用位图表示的索引,对列的每个键值建立一个位图。相对于BTree索引,占用的空间非常小,创建和使用非常快。位图索引由于只存储键值的起止Rowid和位图,占用的空间非常少。

适合

适合决策支持系统;
当select count(XX) 时,可以直接访问索引中一个位图就快速得出统计数据;
当根据键值做and,or或 in(x,y,..)查询时,直接用索引的位图进行或运算,快速得出结果行数据。

不适合

不适合键值较多的列(重复值较少的列);
不适合update、insert、delete频繁的列,代价很高。到底是什么代价呢?update,insert,delete的时候会锁住键值一样的行。

本文标题:MySQL-索引结构

文章作者:王洪博

发布时间:2018年11月08日 - 10:11

最后更新:2019年09月12日 - 10:09

原始链接:http://whb1990.github.io/posts/3bf347e4.html

▄︻┻═┳一如果你喜欢这篇文章,请点击下方"打赏"按钮请我喝杯 ☕
0%