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+

相关推荐
l1t1 小时前
利用DeepSeek实现服务器客户端模式的DuckDB原型
服务器·c语言·数据库·人工智能·postgresql·协议·duckdb
MarkHard1235 小时前
如何利用redis使用一个滑动窗口限流
数据库·redis·缓存
island13147 小时前
【Redis#10】渐进式遍历 | 数据库管理 | redis_cli | RES
数据库·redis·bootstrap
心想事成的幸运大王7 小时前
Redis的过期策略
数据库·redis·缓存
倔强的石头_7 小时前
CentOS 上安装KingbaseES(ISO包)详细教程
数据库
2401_897930068 小时前
使用Docker轻松部署Neo4j图数据库
数据库·docker·neo4j
诗句藏于尽头8 小时前
Django模型与数据库表映射的两种方式
数据库·python·django
寻星探路8 小时前
数据库造神计划第六天---增删改查(CRUD)(2)
java·大数据·数据库
盖世英雄酱581369 小时前
Read timed out问题 排查
java·数据库·后端
云动雨颤10 小时前
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
数据库·spring boot·tomcat