浅谈MySQL分页Limit的性能问题
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,MySQL的分页查询通常通过limit来实现。limit接收1或2个整数型参数,如果是2个参数,第一个是指定第一个返回记录行的偏移量,第二个是返回记录行的最大数目。初始记录行的偏移量是0。为了与Pos
千家信息网最后更新 2025年11月07日浅谈MySQL分页Limit的性能问题
MySQL的分页查询通常通过limit来实现。limit接收1或2个整数型参数,如果是2个参数,第一个是指定第一个返回记录行的偏移量,第二个是返回记录行的最大数目。初始记录行的偏移量是0。为了与PostgreSQL兼容,limit也支持limit # offset #。
问题:
对于小的偏移量,直接使用limit来查询没有什么问题,但随着数据量的增大,越往后分页,limit语句的偏移量就会越大,速度也会明显变慢。
优化思想:避免数据量大时扫描过多的记录
解决:子查询的分页方式或者JOIN分页方式。JOIN分页和子查询分页的效率基本在一个等级上,消耗的时间也基本一致。
下面举个例子。一般MySQL的主键是自增的数字类型,这种情况下可以使用下面的方式进行优化。
以真实的生产环境的6万条数据的一张表为例,比较一下优化前后的查询耗时:
-- 传统limit,文件扫描[SQL]SELECT * FROM tableName ORDER BY id LIMIT 50000,2;受影响的行: 0时间: 0.171s-- 子查询方式,索引扫描[SQL]SELECT * FROM tableNameWHERE id >= (SELECT id FROM tableName ORDER BY id LIMIT 50000 , 1)LIMIT 2;受影响的行: 0时间: 0.035s-- JOIN分页方式[SQL]SELECT * FROM tableName AS t1JOIN (SELECT id FROM tableName ORDER BY id LIMIT 50000, 1) AS t2WHERE t1.id <= t2.id ORDER BY t1.id LIMIT 2;受影响的行: 0时间: 0.036s
可以看到经过优化性能提高了很多倍。
优化原理:
子查询是在索引上完成的,而普通的查询时在数据文件上完成的。通常来说,索引文件要比数据文件小得多,所以操作起来也会更有效率。因为要取出所有字段内容,第一种需要跨越大量数据块并取出,而第二种基本通过直接根据索引字段定位后,才取出相应内容,效率自然大大提升。因此,对limit的优化,不是直接使用limit,而是首先获取到offset的id,然后直接使用limit size来获取数据。
在实际项目使用,可以利用类似策略模式的方式去处理分页。例如,每页100条数据,判断如果是100页以内,就使用最基本的分页方式;如果大于100,则使用子查询的分页方式。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
查询
数据
方式
文件
时间
索引
偏移
内容
影响
问题
参数
字段
效率
支持
性能
明显
普通
有效
一致
万条
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
美国swims成绩数据库
海康vrm录像管理服务器
网络安全宣传周 活动主题
强化法治监管筑牢网络安全
以太网公用网络安全设置
怎样连服务器ip
浙江警察学院网络安全与执法
应用软件开发人员是做什么的
idea下载数据库连接包
国家玉米种子数据库中心大棒68
网络安全等级是几级
阿里去买数据库
财务软件开发c
dicom服务器搭建
周口互联网在线科技有限公司
数据库当前正在使用
数学软件学什么软件开发
山东省通信网络安全中心电话
北京网络安全产业基地
浪潮用虚拟服务器
jstage 数据库
招行软件开发外派国外
服务器获取mac
熊弓网络安全平台
表格里如何建立数据库
跨平台跨数据库的面向对象
服务器电源背板改pc
苹果手机软件开发收费标准
数据库当前正在使用
陕西铭祥联网络技术有限公司