Mysql中索引B+树、最左前缀匹配

这里需要对索引的相关结构有一个基础的认识,比如线性索引,树形索引(二叉树,平衡二叉树,红黑树等),这个up主我觉得讲的还是比较清楚的,可以看下。

终于把B树搞明白了(一)_B树的引入,为什么会有B树_哔哩哔哩_bilibili

主要是三个方面:

  • IO次数减少;
  • 查询性能的高效(等值查询和范围查询的相对高效);
  • 和其他几种索引对应的缺点

1,B+树的非叶子节点没有保存数据,仅仅保存了对应的索引值和指向子节点的指针,这使得一个datapage能够保存更多的索引键值,大幅度减少了了IO次数的操作;

2,B+树是一种自平衡树,所有的数据都在叶子节点上存储,B+树的平衡性保证了查询路径长度一致,在等值查询上,实现查询的O(logn)时间复杂度。B+树又是一个多叉树,树的高度不会随着数据的大量增长快速增加,大量数据的情况下,也是具有较高的查询性能;在范围查询上,B+树的叶子节点的数据可以使用双向链表对其进行遍历,避开了父节点回溯,同样实现了较高的查询效率,除此之外,叶子节点是有序存储,天然适配排序操作;

3,对于其他的索引,比如,哈希无法支持有效的范围查询;二叉树的深度过大,对大数据量不友好;B树的每一个节点都存储数据,导致IO开销较大;跳表,内存中效率接近B+树,但磁盘存储时层数较高,且节点分散导致无法利用磁盘预读。

什么是最左前缀匹配

1,最左索引匹配指的在使用联合索引时,查询条件需要联合索引从最左列开始依次匹配,从第一列开始,然后是第二列,第三列,以此类推,只有在仅最左列,连续前缀,或者完全顺序覆盖的情况下有效。

2,最左前缀匹配原则是因为Mysql索引基于B+树结构,联合索引的存储顺序严格遵循定义的顺序,B+树查找时,需要从最左侧逐层定位,如果跳过开始列(a),则会导致索引失效全表扫描,举个例子,查找国内的某个人,需要确定省份---->城市----->姓名,这样子可以实现快速定位,如果跳过省份,则需要全表扫描才能找到。

3,在这个过程中需要注意范围查询(> 、<、%abc )会打断索引匹配,包含等值查询(>=、<=)或者做前缀匹配(abc%)则不会.

3层B+树大约是多少条数据

对于B+树的存储结构做出下面的假设:

假设

datapage: 16kB

data + key : 1KB

单页数据数:16KB/1KB = 16

key : 8 B

next : 6 B

单页索引指针:16*1024/14~~1170

总的数据总数: 1170 * 1170 * 16 ~~ 21000000+

相关推荐
码农学院5 分钟前
使用腾讯翻译文本
服务器·数据库·c#
@zulnger15 分钟前
正则表达式
数据库·正则表达式
源代码•宸25 分钟前
Golang基础语法(go语言error、go语言defer、go语言异常捕获、依赖管理、Go Modules命令)
开发语言·数据库·后端·算法·golang·defer·recover
optimistic_chen26 分钟前
【Redis 系列】持久化特性
linux·数据库·redis·分布式·中间件·持久化
Coder码匠28 分钟前
从项目实践中学习 Spring 事务范围优化
数据库·spring
我的golang之路果然有问题44 分钟前
mysql 个人笔记导出之-数据库时间戳问题以及增删改查
数据库·笔记·学习·mysql·分享·个人笔记
张永清-老清1 小时前
每周读书与学习->JMeter性能测试脚本编写实战(三)如何利用JMeter为MySQL数据库构造测试数据
数据库·测试工具·jmeter·压力测试·性能调优·jmeter性能测试·每周读书与学习
JH30731 小时前
我的笔记:怎么用 MySQL 的 EXPLAIN 来分析 SQL
笔记·sql·mysql
亮子AI1 小时前
注册成功的提示信息怎么写?
数据库·python