
MySQL大数据量分页查询方法及其优化
1. 直接用
2. 对
发布日期:2021-05-07 23:51:49
浏览次数:17
分类:精选文章
本文共 1741 字,大约阅读时间需要 5 分钟。
MySQL 大数据量分页查询方法及其优化
查询方法
在处理大数据量的分页查询时,选择合适的方法至关重要。以下是几种常见的分页方法及其适用场景:
方法1:直接使用数据库提供的SQL语句
适用于数据量较少的情况(元组百/千级)
SELECT * FROM 表名称 LIMIT M,N
缺点:全表扫描,速度较慢,且结果集返回不稳定。
方法2:建立主键或唯一索引,利用索引(假设每页10条)
适用于数据量多的情况(元组数上万)
SELECT * FROM 表名称 WHERE id_pk > (pageNum*10) LIMIT M
注意:由于数据未按id_pk
排序,可能会导致数据遗漏,必须结合方法3使用。
方法3:基于索引再排序
适用于数据量多的情况(元组数上万)
SELECT * FROM 表名称 WHERE id_pk > (pageNum*10) ORDER BY id_pk ASC LIMIT M
优点:索引扫描加速,结果集稳定。
方法4:基于索引使用prepare
适用于大数据量
PREPARE stmt_name FROM SELECT * FROM 表名称 WHERE id_pk > (?* ?) ORDER BY id_pk ASC LIMIT M
方法5:利用MySQL支持的ORDER操作
快速定位部分元组,避免全表扫描
SELECT * FROM your_table WHERE pk > 1000 ORDER BY pk ASC LIMIT 20
方法6:利用子查询或连接
快速定位元组的位置,再读取元组
SELECT * FROM your_table WHERE id < (SELECT id FROM your_table ORDER BY id DESC LIMIT (pageNum-1)*pageSize ORDER BY id DESC LIMIT pageSize)
SELECT * FROM your_table AS t1 JOIN (SELECT id FROM your_table ORDER BY id DESC LIMIT (pageNum-1)*pageSize AS t2 WHERE t1.id <= t2.id ORDER BY t1.id DESC LIMIT pageSize) t2
测试实验
1. 直接用LIMIT
分页问题的性能测试
测试结果:
- 起始记录为10,100,1000,10000时,查询时间分别为0.016秒、0.016秒、0.047秒、0.094秒。
- 起始记录为40万时,查询时间为3.229秒。
- 最后一页(86万)查询时间为37.44秒。
结论:
LIMIT
语句的查询时间与起始记录位置成正比。- 对大数据量表不适合直接使用
LIMIT
分页。
2. 对LIMIT
分页问题的性能优化方法
方法:利用覆盖索引加速分页查询
- 主键索引优化:
SELECT id FROM product LIMIT 866613, 20
时间为0.2秒,相比全表扫描提升100多倍。
- 适用方法:
SELECT * FROM product WHERE id > (SELECT id FROM product LIMIT 866613, 1) LIMIT 20
时间为0.2秒。
3. 复合索引优化方法
示例:单独使用主键索引优化查询
SELECT id FROM collect WHERE vtype=1 ORDER BY id LIMIT 90000,10
时间为8-9秒。
优化建议:使用复合索引
- 建立覆盖索引:
SELECT id FROM collect WHERE vtype=1 ORDER BY id LIMIT 90000,10
时间为0.04秒。
- 尽量只查询主键:
SELECT id FROM collect WHERE vtype=1 LIMIT 90000,10
时间为0.5秒。
结论:合理设计索引可显著提升性能,但需综合考虑查询需求和索引设计。
总结
通过合理的索引设计和查询优化,可以显著提升MySQL大数据量分页查询的性能。选择合适的分页方法和优化策略,是提升数据库性能的关键。
发表评论
最新留言
不错!
[***.144.177.141]2025年03月22日 08时04分29秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
算法笔记:递归、动态规划
2019-03-06
Pytest插件开发
2019-03-06
常用Windows 快捷键
2019-03-06
linux命令-压缩与打包
2019-03-06
ORACLE 11g 生产中高水位线(HWM)处理
2019-03-06
centos 6.x 编译安装 pgsql 9.6
2019-03-06
weblogic 服务器部署SSL证书
2019-03-06
oracle 11g not in 与not exists 那个高效?
2019-03-06
Linux 安装Redis 5.0(以及参数调优)
2019-03-06
html5 Game开发系列文章之 零[开篇]
2019-03-06
为什么阿里巴巴建议集合初始化时,指定集合容量大小
2019-03-06
为什么阿里巴巴要求谨慎使用ArrayList中的subList方法
2019-03-06
Redis不是一直号称单线程效率也很高吗,为什么又采用多线程了?
2019-03-06
基于Python的Appium环境搭建合集
2019-03-06
Requests实践详解
2019-03-06
接口测试简介
2019-03-06
Golang Web入门(4):如何设计API
2019-03-06
让sublime实现js控制台(前提是安装了nodejs)
2019-03-06