从63 秒到 0.482 秒:深入剖析 MySQL 分页查询优化
创作时间:
作者:
@小白创作中心
从63 秒到 0.482 秒:深入剖析 MySQL 分页查询优化
引用
CSDN
1.
https://blog.csdn.net/qq_51447436/article/details/145320461
在数据库开发中,分页查询性能问题一直是一个棘手的难题。本文将从MySQL索引机制入手,深入剖析其底层原理(B+树),结合实际场景讲解分页查询优化的技巧,并通过实验数据展示优化效果。通过本文的学习,你将掌握如何将查询时间从几十秒缩短到几百毫秒的优化方法。
MySQL 索引机制
索引是什么?
索引是一种提高查询速度的数据结构。它的作用类似于书的目录,可以帮助MySQL快速找到目标数据,而不是逐页翻找。
MySQL 的索引类型
- 聚簇索引(Clustered Index):
- InnoDB存储引擎默认的主键索引。
- 特点:数据和索引存储在一起,叶子节点存储的是完整行的数据。
- 每个表只能有一个聚簇索引。
- 示例:假设一张用户表以
id
为主键,索引结构如下:根节点 → 中间节点 → 叶子节点(存储完整行数据)
- 辅助索引(Secondary Index):
- 除主键外的其他索引,例如普通索引和唯一索引。
- 特点:叶子节点存储的是主键值,通过主键值回表查询完整数据。
- 适用场景:用于加速非主键列的查询。
MySQL 缓存机制的变化
MySQL 8.0 删除了查询缓存(Query Cache):
原因:查询缓存频繁失效,影响性能,在高并发写场景下尤为明显。
查询缓存的替代:更高效的优化器和InnoDB缓存机制。
MySQL 的 Buffer Pool:
依旧是核心性能优化手段。
功能:将数据页、索引页缓存到内存中,减少磁盘I/O。
特点:即使查询缓存被删除,Buffer Pool仍然支持高效的索引查询和数据读取。
索引的底层原理
什么是 B+树?
B+树是一种平衡多路搜索树,广泛应用于数据库和文件系统中,用于存储索引。
B+树的结构
- 非叶子节点:
- 只存储索引键,起到导航作用。
- 减少了节点大小,提高了节点的分支因子。
- 叶子节点:
- 存储所有实际数据(聚簇索引)或主键值(辅助索引)。
- 通过链表指针串联,便于范围查询。
B+树的特点
- 平衡性:所有叶子节点都在同一层,查询效率稳定。
- 磁盘友好:每个节点存储多个索引键,减少了磁盘I/O次数。
- 范围查询高效:叶子节点的链表结构支持顺序遍历。
为什么 MySQL 使用 B+树?
- 相比B树:B+树的非叶子节点存储更多的索引键,更适合大规模数据存储。
- 相比哈希索引:B+树支持范围查询和排序,而哈希索引只支持等值查询。
优化 SQL 排序分页查询的场景
问题描述
假设我们需要从content
表中查询最近的第2000000条到第2000010条数据:
SELECT * FROM content ORDER BY create_time DESC LIMIT 2000000, 10;
存在的问题
- 大偏移量(OFFSET):
- 数据库需要扫描并丢弃前2000000条记录,浪费资源。
- 即使有索引,MySQL仍需逐一读取和排序这些记录。
- 全表扫描的风险:
- 如果
create_time
没有索引,查询会触发全表扫描。
优化思路
- 利用子查询限定范围:
- 子查询通过索引直接定位目标主键范围。
- 主表查询通过主键精确匹配记录,减少无效扫描。
优化前后对比
优化前 SQL:
SELECT * FROM content ORDER BY create_time DESC LIMIT 2000000, 10;
优化后 SQL:
SELECT *
FROM content
INNER JOIN (
SELECT id
FROM content
ORDER BY create_time DESC
LIMIT 2000000, 10
) temp_content
ON content.id = temp_content.id;
优化前后性能数据
优化前:
查询耗时:63s
原因:扫描大量数据并丢弃前2000000条记录,逻辑开销大。
优化后:
查询耗时:0.482s
原因:子查询通过索引快速定位目标记录范围,主表只查询需要的数据。
为什么优化后性能提升显著?
- 子查询利用索引
- 子查询
SELECT id FROM content ORDER BY create_time DESC LIMIT 2000000, 10
利用了create_time
索引。 - 索引通过B+树快速定位到目标范围,减少了全表扫描。
- 减少了无效的数据处理
- 优化前:扫描并丢弃了2000000条数据。
- 优化后:只查询需要的数据。
- 高效利用缓存
- 优化后的查询范围更小,Buffer Pool的命中率更高。
- 避免了大范围扫描导致的缓存失效问题。
- 排序开销显著降低
- 子查询已经完成排序,主查询不需要重复排序,节省了计算资源。
热门推荐
被原子弹轰炸后100年内真的不能住人吗?为何广岛长崎如今都有人居住
新手家长必收藏,儿童多动症干预指南
什么是香港老千股?如何识别和防范香港老千股?
盲盒的坑,你踩过吗?一批典型案例,今日公布
“未来教师”会是怎样的?有这十大特征
如何通过单元测试发现bug
经典广东俗语大全
人工智能写小说靠谱吗?DeepSeek爆火为网络文学作家带来新思索
农垦国有土地管理:现状、挑战与创新实践
奸相李林甫:权倾朝野,奸诈狡猾,他是如何爬上帝国宰相之位的?
三年级亲子活动有哪些?三年级亲子活动大公开!快乐成长,轻松陪伴!
磕掉牙怎么办?五种专业治疗方法全解析
上班族必备:舒适穿搭提升效率!
突破!白求恩国际和平医院成功开展首例人工肝技术,为重症肝病患者带来新希望!
首饰金与回收金,克价差近200元
孩子为什么对父母态度不好?专家老师带你探寻根源与实用解决方案
封神榜里的姜子牙,最后为什么没有为自己封神?答案来了!
弄错可能加重症状!眼睛不适,到底该热敷还是冷敷?
带苏的男孩名字怎么起 2024年龙宝宝起名字带苏字
它们是历史文化的守望者 也是现代生活的滋养者
解析申论与综应差异:综应难度是否较申论简单?
绿幽灵消磁指南:三种实用方法让你的水晶重焕光彩
港前三与内地一流大学相比,有何优势劣势?
摸狗头在狗狗心里究竟意味着什么?是亲昵还是挑战?还是另有原因
荣格原型理论:主要原型、历史与批判
(开源)搓一个FPGA FM收音机--从仿真到实现
李靖为何塔不离手?他是真不敢放下,千万别小看了哪吒弑父的决心
一文读懂电动汽车热管理系统(TMS)
冬季吃梨子的9大好处
复活灭绝生物不再是梦想!5.2万年前猛犸象三维染色体结构首次重建