上一篇
2025年8月最新动态
MySQL 9.0预览版近期曝光的基准测试显示,针对千万级数据的分页查询,新版优化器对LIMIT OFFSET
的处理效率提升了约40%,但官方文档仍强调:深度分页问题本质上需要开发者通过索引和查询结构优化解决。
当用户点击"第100页"时,系统其实在执行:
SELECT * FROM orders ORDER BY id DESC LIMIT 1000, 20;
这句看似简单的查询,MySQL却需要先读取1020条记录,再丢弃前1000条,数据量越大,性能断崖式下跌越明显。
-- 第一页(常规查询) SELECT * FROM orders ORDER BY id DESC LIMIT 20; -- 获取上一页最后一条记录的ID(假设为last_id) SELECT * FROM orders WHERE id < last_id -- 关键点:利用索引定位 ORDER BY id DESC LIMIT 20;
优势:
SELECT t.* FROM orders t INNER JOIN ( SELECT id FROM orders ORDER BY create_time DESC LIMIT 100000, 20 ) tmp ON t.id = tmp.id;
原理:
-- 错误示范(索引失效): SELECT * FROM products WHERE category='电子产品' ORDER BY price DESC LIMIT 50, 10; -- 正确索引: ALTER TABLE products ADD INDEX (category, price);
当优化器"犯糊涂"时:
SELECT * FROM users FORCE INDEX(primary) WHERE status=1 ORDER BY id DESC LIMIT 100000, 10;
对总页数等不变数据,用Redis缓存:
# Python伪示例 total = cache.get('user_count') if not total: total = db.execute("SELECT COUNT(*) FROM users") cache.set('user_count', total, 3600)
使用覆盖索引+临时表:
SELECT t.* FROM ( SELECT id FROM items WHERE is_deleted=0 ORDER BY view_count DESC LIMIT 50000, 10 ) tmp JOIN items t ON tmp.id = t.id;
-- 允许少量重复的近似分页 SELECT * FROM logs WHERE create_time <= '2025-08-01' ORDER BY create_time DESC LIMIT 20;
方案 | 第10页耗时 | 第1000页耗时 |
---|---|---|
传统LIMIT OFFSET | 120ms | 4200ms |
游标分页 | 80ms | 90ms |
延迟关联 | 150ms | 300ms |
运维老鸟建议:
ANALYZE TABLE
更新统计信息 2025年趋势观察:
阿里云最新发布的数据库诊断报告显示,未优化的分页查询占慢查询日志的32%,随着Web应用数据量持续增长,掌握这些技巧已成为后端开发者的必备技能,下次当你面对分页需求时,不妨先问问自己:这次能不能不用OFFSET?
本文由 贰莺韵 于2025-08-01发表在【云服务器提供商】,文中图片由(贰莺韵)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/503311.html
发表评论