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+

相关推荐
m0_550024631 小时前
持续集成/持续部署(CI/CD) for Python
jvm·数据库·python
AC赳赳老秦1 小时前
代码生成超越 GPT-4:DeepSeek-V4 编程任务实战与 2026 开发者效率提升指南
数据库·数据仓库·人工智能·科技·rabbitmq·memcache·deepseek
啦啦啦_99991 小时前
Redis-2-queryFormat()方法
数据库·redis·缓存
玄同7652 小时前
SQLite + LLM:大模型应用落地的轻量级数据存储方案
jvm·数据库·人工智能·python·语言模型·sqlite·知识图谱
吾日三省吾码2 小时前
别只会“加索引”了!这 3 个 PostgreSQL 反常识优化,能把性能和成本一起打下来
数据库·postgresql
chian-ocean2 小时前
百万级图文检索实战:`ops-transformer` + 向量数据库构建语义搜索引擎
数据库·搜索引擎·transformer
那个村的李富贵2 小时前
解锁CANN仓库核心能力:50行代码搭建国产化AIGC图片风格迁移神器
mysql·信息可视化·aigc·cann
小Tomkk2 小时前
数据库 变更和版本控制管理工具 --Bytebase 安装部署(linux 安装篇)
linux·运维·数据库·ci/cd·bytebase
qq_12498707533 小时前
基于JavaWeb的大学生房屋租赁系统(源码+论文+部署+安装)
java·数据库·人工智能·spring boot·计算机视觉·毕业设计·计算机毕业设计
倒流时光三十年3 小时前
SpringBoot 数据库同步 Elasticsearch 性能优化
数据库·spring boot·elasticsearch