Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql深分页查询

MySQL 深分页查询优化实践与经验分享

作者:kkkkkkkkl24

文章总结了在企业级项目中优化深分页查询的经验,包括执行计划分析、索引优化和游标分页改写,通过复合索引和游标分页,可以显著提高查询性能,感兴趣的朋友跟随小编一起看看吧

在企业级项目中,深分页查询经常会成为性能瓶颈。本篇文章总结了我在实践中优化深分页 SQL 的经验,包括 执行计划分析、索引优化、游标分页改写 等内容。

一、问题场景

假设我们有一张订单表 orders,包含字段:

id, user_id, status, total_amount, create_time

原始查询为:

SELECT id, user_id, status, total_amount, create_time
FROM orders
WHERE user_id = 12345
ORDER BY create_time DESC
LIMIT 990, 10;

二、原始 SQL 执行计划分析

使用 EXPLAIN查看原始 SQL:

idselect_typetabletypepossible_keyskeykey_lenrowsExtra
1SIMPLEordersrefuser_iduser_id450Using filesort

分析:

✅ 结论:单列索引只能加速 WHERE 条件,排序仍需额外操作。

三、复合索引优化

为了提升查询效率,我们创建复合索引:

ALTER TABLE orders ADD INDEX idx_user_create (user_id, create_time DESC);
idselect_typetabletypepossible_keyskeykey_lenrowsExtra
1SIMPLEordersrefidx_user_createidx_user_create820Using index condition

分析:

✅ 结论:复合索引同时覆盖 WHERE + ORDER BY,大幅减少扫描行数和排序成本。

四、游标分页改写

深分页仍有偏移量大的问题,可以改写为游标分页:

SELECT id, user_id, status, total_amount, create_time
FROM orders
WHERE user_id = 12345 AND create_time < '2024-06-01 12:00:00'
ORDER BY create_time DESC
LIMIT 10;
idselect_typetabletypepossible_keyskeykey_lenrowsExtra
1SIMPLEordersrangeidx_user_createidx_user_create810Using index condition

✅ 结论:扫描行数恒定,排序在索引中完成,性能最佳。

五、实践总结

到此这篇关于MySQL 深分页查询优化实践与经验分享的文章就介绍到这了,更多相关mysql深分页查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文