MySQL 优化分页思路
一般分页查询时,通过创建覆盖索引能够比较好地提高性能。一个常见又非常头痛的分页场景是“limit 1000,20”,此时 MySQL排序出前 1020条记录后仅仅需要返回第 1001到 1020条记录,前1000条记录都会被抛弃,查询和排序的代价非常高。
1.第一种优化思路
在索引上完成排序分页的操作,最后根据主键关联回原表查询所需要的其他列内容
EXPLAIN SELECT film_id, description FROM film ORDER BY title LIMIT 50, 5
直接查询的时候,能够从explain的输出结果中看到优化器实际上做了全表扫描,处理效率不高
EXPLAIN SELECT a.film_id, a.description FROM film a INNER JOIN ( SELECT film_id FROM film ORDER BY title LIMIT 50, 5 ) b ON a.film_id = b.film_id
按照索引分页后回表方式改写SQL后,从explain的输出结果中已经看不到全表扫描了
这种方式让MySQL扫描尽可能少的页面来提高分页效率。
2.第二种优化思路
把LIMIIT查询转换成某个位置的查询
EXPLAIN SELECT * FROM payment ORDER BY rental_id DESC LIMIT 410, 10
翻页的过程中通过增加一个参数last_page_record,用来记录上一页最后一行的租赁编号rental_id,例如第41页最后一行的租赁编号rental_id=15640
那么在翻页到第42页时,可以根据第41页最后一条记录向后追溯,相应的SQL可以改写为
EXPLAIN SELECT * FROM payment WHERE rental_id < 15640 ORDER BY rental_id DESC LIMIT 10
注意,这样把LIMIT m,n 转换成LIMIT n的查询,只适合在排序字段不会出现重复值的特定环境,能够减轻分页翻页的压力;如果排序字段出现大量重复值,而仍进行这种优化,那么分页结果可能会丢失部分记录,不适用这种方式进行优化。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2017-01-12 设置SVN不需要提交的文件
2017-01-12 js jquery 获取元素(父节点,子节点,兄弟节点),元素筛选