当前位置:网站首页>MySQL索引的B+树到底有多高?
MySQL索引的B+树到底有多高?
2022-08-10 11:56:00 【InfoQ】
一、问题
- h:统称索引的高度;
- h1:聚簇索引的高度;
- h2:二级辅助索引的高度;
- k:中间结点的扇出系数。
二、分析
2.1 索引高度h与页面I/O数的关系
- 点查询: 聚族索引:h1 二级索引: 覆盖索引:h2 回表查询:h2+h1
- 范围查询:这种情况相对比较复杂,但跟点查询的原理类似,读者可自行分析;
- 全表查询:B+树的叶子结点是通过链表连接起来的,对于全表查询,需要从头到尾将所有的叶子结点访问一遍。
2.2 索引高度h的理论计算
三、查看索引真实高度的方法

SELECT b.name, a.name, index_id, type, a.space, a.PAGE_NO
FROM information_schema.INNODB_SYS_INDEXES a,
information_schema.INNODB_SYS_TABLES b
WHERE a.table_id = b.table_id
AND a.space <> 0;$hexdump -C -s 49216 -n 10 user.ibd
0000c040 00 01 00 00 00 00 00 00 03 2b- 通过information_schema.INNODB_SYS_INDEXES和information_schema.INNODB_SYS_TABLES找到对应索引Root页在ibd文件的页面号PAGE_NO(聚簇索引通常为3,其他索引往上累加);
- 通过hexdump -C -s 16384*PAGE_NO+64 -n 10 user.ibd,前两个字节+1即为索引的高度。
四、验证索引的真实高度
CREATE TABLE `user` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`card_id` INT(11) NOT NULL DEFAULT '0' COMMENT '身份证号',
`name` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '英文名字',
`age` TINYINT(2) UNSIGNED NOT NULL DEFAULT '0' COMMENT '年龄',
`content` VARCHAR(1024) NOT NULL DEFAULT '' COMMENT '附属信息',
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最近更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_card_id` (`card_id`),
KEY `idx_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';五、总结
- 一次查询的页面I/O数跟索引高度h呈正相关,主要分为以下几种情况:点查询: 聚族索引:h1 二级索引: 覆盖索引:h2 回表查询:h2+h1范围查询:这种情况相对比较复杂,但跟点查询的原理类似,读者可自行分析;全表查询:B+树的叶子结点是通过链表连接起来的,对于全表查询,需要从头到尾将所有的叶子结点访问一遍。
- 索引高度通常为2~4层。在高度h=3、主键为int类型、行记录大小为1KB时,可索引的总行数为1170^2*16=2190W。这也是很多大厂将2000W作为分库分表标准的原因;
- 查看索引真实高度的方法如下:
- 通过information_schema.INNODB_SYS_INDEXES和information_schema.INNODB_SYS_TABLES找到对应索引Root页在ibd文件的页面号PAGE_NO(聚簇索引通常为3,其他索引往上累加);
- 通过hexdump -C -s 16384*PAGE_NO+64 -n 10 user.ibd,前两个字节+1即为索引的高度。
- 索引高度h也跟索引字段的数据类型有关。如果是int或short,扇出系数大,索引效率更好,整个索引看起来属于“矮胖”型;而如果是varchar(32)等,那扇出系数就低了,整个索引看起来属于“瘦高”型,索引效率自然要低些。所以我们在字段选取类型时,其类型越简单效率越好。
#聚簇索引(第一个)
hexdump -C -s 49216 -n 10 user.ibd
#第二个索引
hexdump -C -s 65600 -n 10 user.ibd
#第三个索引
hexdump -C -s 81984 -n 10 user.ibd边栏推荐
猜你喜欢

第5章 虚拟存储器

太香了!自从用了这款接口神器,我的团队效率提升了 60%!

CLIP还能做分割任务?哥廷根大学提出一个使用文本和图像prompt,能同时作三个分割任务的模型CLIPSeg,榨干CLIP能力...

阿里架构师整理一份企业级SSM架构实战文档,让你熟悉底层原理

爱可可AI前沿推介(8.10)

可视化服务编排在金融APP中的实践

你是怎么知道数据库 Htap 能力强弱的?怎么能看出来

How to do foreign media publicity to grasp the key points

7. Instant-ngp
What are the five common data types of Redis?What is the corresponding data storage space?Take you to learn from scratch
随机推荐
Crypto Gaming: The Future of Gaming
jlink 与 swd 接口定义
日记16
LeetCode 21. Merge two ordered linked lists
面试官:你们是如何保证接口的幂等性?
AICOCO AI Frontier Promotion (8.10)
CodeForces - 628D (数位dp)
Custom filters and interceptors implement ThreadLocal thread closure
[List merge] Combine multiple lists into one list
【集合】HashSet和ArrayList的查找Contains()时间复杂度
LeetCode 109. Sorted Linked List Conversion Binary Search Tree
人脸考勤是选择人脸比对1:1还是人脸搜索1:N?
托米的咒语
IM即时通讯开发WebSocket从入门到精通
Can CLIP also do segmentation tasks?The University of Göttingen proposed a model CLIPSeg that uses text and image prompts to perform three segmentation tasks at the same time, draining CLIP capabiliti
Apple bucks the trend and expands iPhone 14 series stocking, with a total of 95 million units
加密游戏:游戏的未来
基础 | batchnorm原理及代码详解
LT8911EXB MIPI CSI/DSI转EDP信号转换
Excel函数公式大全—LOOKUP函数