MySQL-索引总结

(1)B-Tree 索引
MySQL中的b树索引实现有一些不同,采用的是b-树结构,但是叶子结点指向引用记录,叶子结点链接成线性列表等使用的是b+树技术。(变种B+Tree)

B-Tree索引对于索引列(索引列可以是多个数据列)是顺序组织存储的。对于以下几种类型查询是有效的。
a 全值匹配
b 匹配最左前缀(只能是匹配最左边的列)
c 匹配列前缀(匹配最左边列的开头部分)
d 匹配范围值(只能是匹配最左边列的范围)
e 精确匹配某一列范围匹配另外一列(左边列精确匹配)
d 只访问索引

B-Tree的局限
a 如果不是按照索引的最左列开始查找则无法使用索引。
b 不能跳过索引中的列
c 如果查询有某个列的范围查询,则其右边的所有列都无法使用索引优化查询

注意:索引的顺序非常的重要,以上的限制都是和索引的顺序有关。优化性能时可能需要相同的列但顺序不同的索引来满足不同类型的查询需求。

比如对列 a b 建索引 
select a from tableA where a = xxx;
select a,b from tableA where a = xxx and b = xxx;、
以上两行查询都是遵循了最左匹配原则

也有些限制不是B-Tree导致的,而是MySQL优化器和存储引擎使用索引的方式导致的。

(2)哈希索引
哈希索引基于哈希表实现,只有精确匹配索引所有列的查询才有效。对于每行数据,根据所有的索引列计算出哈希码。哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。

MySQL中,只有Memory引擎显示支持哈希索引(支持非唯一哈希索引,产生索引冲突的会以链表的方式存放多个记录指针到同一个哈希条目中),同时也支持B-Tree索引。

优点:索引自身只需要存储对应的哈希值,所以索引的结构十分紧凑,这也让哈希查找的速度非常的块。

限制:
a 哈希索引只包括哈希值和行指针,而不存储字段值,所以不能使用索引中的值来避免读取行。
b 哈希索引顺序并不是按照索引值顺序查找的,所以无法用于排序。
c 哈希索引无法支持部分索引列匹配查找,因为哈希索引始终是使用索引列的全部内容计算哈希值的。
d 哈希索引只支持等值比较查询,不支持任何范围查询。
e 哈希冲突较多时,索引维护操作的代缴较高。

由于这些限制,哈希索引只适用于某些特定的场合。一旦适合哈希索引,则它带来的性能提升将会非常显著。

自定义哈希索引:目前就Memory和NDB支持哈希索引,比如InnoBD就可以创建伪哈希索引享受一些哈希索引的便利(例如为内容很长的索引创建内容很小的哈希索引)
自定义哈希索引在处理哈希冲突时 必须在查询条件带上常量值限定值

(3)自适应哈希索引
InnoDB引擎有一个特殊功能叫 “自适应哈希索引” 。当InnoDB注意到某些索引值被使用得非常频繁时,它会在内存中基于B-Tree索引之上在创建一个哈希索引,为这些热点数据创建哈希索引,这样就让B-Tree索引也具有哈希索引的一些优点。( 这是一个完全自动的,内部的行为,用户无法控制或者配置,可以关闭 )

(4)空间数据索引
MyISAM表支持空间索引,可以用作地理数据存储。和B-Tree不同,这类索引无须前缀查询。空间索引会从所有维度来索引数据。查询时可以有效地使用任意维度来组合查询。

(5)全文索引
全文索引是一种特殊类型的索引,查找的是文本中的关键词。而不是直接比较索引中的值。
注意:在相同的列上同时创建全文索引和基于值的B-Tree索引不会有冲突。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值