关于索引以及缓冲池的一些疑惑

为什么使用Hash?

如果某个数据经常被访问,当满足一定条件的时候,就会将这个数据页的地址存放到 Hash 表中。这样下次查询的时候,就可以直接找到这 个页面的所在位置。

需要说明的是自适应 Hash 索引只保存热数据(经常被使用到的数据),并非全表数据。因 此数据量并不会很大,因此自适应 Hash 也是存放到缓冲池中,这样也进一步提升了查找效 率。

Hash冲突

Hash 表是数组 + 链表的形式。通过 Hash 函数可以计算索引键值所对应的 bucket(桶) 的位置,如果产生 Hash 冲突,就需要遍历链表来解决。

Hash索引缺陷和优点 

缺点

Hash 索引仅能满足(=)(<>)和 IN 查询,不能使用范围查询。此外,数据的存储是没有顺序的,在 ORDER BY 的情况下,使用 Hash 索引还需要对数据重新排序。而对于联合索引的情况,Hash 值是将联合索引键合并后一起来计算的,无法对单独的一个键或者几个索引键进行查询。

优点

因为 Hash 索引在进行数据检索的时候效率非常高,通常只 需要 O(1) 的复杂度,也就是一次就可以完成数据的检索。

什么是联合索引的最左原则?

假设我们有 x、y、z 三个字段,创建联合索引(x, y, z)之后,我们可以把 x、y、z 分别类 比成“百分位”、“十分位”和“个位”。

1.查询“y=8 AND z=7”,就用不上索引了,因为可能存在 187、287、387、487………这 样就必须扫描所有数值。

2.当我们查询“x=9 AND y>8 AND z=7”的时候,如果建立了 (x,y,z) 顺序的索引,这时候 z 是用不上索引的。这是因为 MySQL 在匹配联合索引最左前缀的时候,如果遇到了范围查 询,比如(<)(>)和 between 等,就会停止匹配。索引列最多作用于一个范围列,对于后面的 Z 来说,就没法使用到索引了。

最后你需要记住,如果我们遇到了范围条件查询,比如(<)(<=)(>)(>=)和 between 等,那么范围列后的列就无法使用到索引了


使用缓冲池技术的原因

InnoDB 存储引擎基于磁盘文件存储,访问物理硬盘和在内存中进行访问,速度相差很大,为了尽可能弥补这两者之间 I/O 效率的差值,我们就需要把经常使用的数据加载到缓冲池中,避免每次访问都进行磁盘 I/O

“频次 * 位置”原则

位置决定效率,提供缓冲池就是为了在内存中可以直接访问数据。

频次决定优先级顺序。因为缓冲池的大小是有限的,比如磁盘有 200G,但是内存只 有 16G,缓冲池大小只有 1G,就无法将所有数据都加载到缓冲池里,这时就涉及到优先级 顺序,会优先对使用频次高的热数据进行加载。

预读

缓冲池的作用就是提升 I/O 效率,而我们进行读取数据的时候存在一个“局部性原理”, 也就是说我们使用了一些数据,大概率还会使用它周围的一些数据,因此采用“预读”的机 制提前加载,可以减少未来可能的磁盘 I/O 操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值