Mysql索引-索引的常见模型

哈希表是一种以键-值(key-value)存储数据的结构,把值放在数组里,用一个哈希函数把key换算成一个确定的位置,然后把value放在数组的这个位置。同一个值的情况,拉出一个链表。

优点:
key值不是递增的,新增速度很快,只需要往后追加。
缺点:
因为不是有序的,所以哈希索引做区间查询的速度是很慢的,需要全表扫描。

MySQL的HASH使用场景

InnoDB存储引擎会监控对表上各索引页的查询。如果观察到建立哈希索引可以带来速度提升,则建立哈希索引,称之为自适应哈希索引(Adaptive Hash Index,AHI) 。
AHI是通过缓冲池的B+树页构造而来,因此建立的速度很快,而且不需要对整张表构建哈希索引。
InnoDB存储引擎会自动根据访问的频率和模式来自动地为某些热点页建立哈希索引。
AHI有一个要求,即对这个页的连续访问模式必须是一样的。例如对于(a,b)这样的联合索引页,其访问模式可以是以下情况:
1.WHERE a=xxx
2.WHERE a= xxx and b=xxx
访问模式一样指的是査询的条件一样,若交替进行上述两种查询,那么 InnoDB存储引擎不会对该页构造AHI,此外AHI还有如下的要求:
1.以该模式访问了100次
2.页通过该模式访问了N次,其中=页中记录*1/16

根据 InnoDB存储引擎官方的文档显示,启用AHI后,读取和写入速度可以提高2倍,辅助索引的连接操作性能可以提高5倍。
毫无疑问,AHI是非常好的优化模式,其设计思想是数据库自优化的(self-tuning),即无需DBA对数据库进行人为调整。
通过命令 SHOW ENGINE INNODB STATUS;可以看到AHI的使用信息了,包括AHI的大小、使用情况、每秒使用AHI搜索的情况。
通过 hash searches: non-hash searches可以大概了解使用哈希索引后的效率。
参数 innodb_adaptive_hash_index来考虑是禁用或启动此特性,默认AHI为开启状态。

哈希表这种结构适用于只有等值查询的场景,比如Memcached及其他一些NoSQL引擎。


有序数组在等值查询和范围查询场景中的性能就都非常优秀。

如果仅仅看查询效率,有序数组就是最好的数据结构了。需要更新数据的时候往中间插入一个记录就必须得挪动后面所有的记录,成本太高。

有序数组索引只适用于静态数据存储引擎


B+树索引在InnoDB中,表都是根据主键顺序以索引的形式存放的,这种存储方式的表称为索引组织表。
数据都是存储在B+树中,每一个索引在InnoDB里面对应一棵B+树。
根据叶子节点的内容,索引类型分为主键索引和非主键索引。
主键索引的叶子节点存的是整行数据,主键索引也被称为聚簇索引(clustered index)。
非主键索引的叶子节点内容是主键的值,非主键索引也被称为二级索引(secondary index)。

基于主键索引和普通索引的查询有什么区别?

主键查询方式,则只需要搜索ID这棵B+树;
普通索引查询方式,则需要先搜索普通索引树,得到ID的值为xx,再到ID索引树搜索一次。这个过程称为回表。

索引维护

B+树为了维护索引有序性,在插入新值的时候需要做必要的维护。插入新数据,或者数据移位。
如果R5所在的数据页已经满了,根据B+树的算法,这时候需要申请一个新的数据页,然后挪动部分数据过去。这个过程称为页分裂。在这种情况下,性能自然会受影响。
除了性能外,页分裂操作还影响数据页的利用率。原本放在一个页的数据,现在分到两个页中,整体空间利用率降低大约50%。
当然有分裂就有合并。当相邻两个页由于删除了数据,利用率很低之后,会将数据页做合并。合并的过程,可以认为是分裂过程的逆过程。
主键长度越小,普通索引的叶子节点就越小,普通索引占用的空间也就越小。

[资料来源]
1.Mysql实战45讲-丁奇
2.MySQL技术内幕

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值