B-Tree索引
B-Tree索引的适用场景
- 全值匹配
- 列表内容
- 匹配最左前缀
- 匹配列前缀
- 匹配范围值
- 精确匹配某一列并范围匹配另一列
- 只访问索引的查询
B-Tree索引的限制场景
- 如果不是按照索引的最左列进行查找,那么无法使用索引
- 不能跳过索引的列
- 列表内容
- 如果查询中有某个列的范围查询,则其右边所有列都无法使用索引优化查询
哈希索引(自定义哈希索引)
哈希索引的使用场景
- 精确匹配索引所有列的查询才有效
哈希索引的限制场景
- 哈希索引只包含哈希值和行指针,不存储字段值,所以不能使用索引中的值来避免读取行。不过,访问内存中行的速度很快,所以大部分情况下这一点对性能的影响并不明显。
- 哈希索引数据并不是按照索引值顺序存储的,所以也就无法用于排序。
- 哈希索引也不支持部分索引列匹配查找。
- 哈希索引只支持等值比较查询,包括:=,IN(),<=>(注意<>和<=>是不同的操作),也不支持任何范围查询,比如:WHERE PRICE > 100。
- 访问哈希索引的数据非常快,除非有很多的哈希冲突(不同的索引列值却有相同的哈希值)。当出现哈希冲突的时候,存储引擎必须遍历链表中的所有行指针,逐行进行比较,直到找到所有符合条件的行。
- 如果哈希冲突很多的话,一些索引维护操作的代价也会很高。例如:如果在某个选择性很低的列上建立哈希索引,那么当从表中删除一行时,存储引擎需要遍历对应哈希值的链表中的每一行,找到并删除对应行的引用,冲突越多,代价越大。
其他索引
- 空间数据索引(R-Tree)
- 全文索引
- 分形树索引
- 聚簇索引
- 覆盖索引