在MySQL中如何使优化limit分页查询

https://blog.csdn.net/lxw1844912514/article/details/100029337

https://blog.csdn.net/weixin_42784553/article/details/105382364?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0.essearch_pc_relevant&spm=1001.2101.3001.4242

https://blog.csdn.net/HD243608836/article/details/104614505?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.essearch_pc_relevant&spm=1001.2101.3001.4242

1.用覆盖索引
2.组合索引
ALTER TABLE table_name ADD INDEX index_name(msg_to,chat_type,msg_from,timestamp,id);

主要后端服务器发生宕机,所有接口超时。宕机半小时后,又自动恢复正常。但是过了2小时,又再次发生宕机。

通过接口日志,发现MySQL数据库无法响应服务器。在阿里云的技术支持的帮助下,发现了MySQL数据库中存在大量慢查询,导致CPU负载过高。最后,根据慢查询日志,定位到了出问题的SQL和业务接口。

SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
分页查询时,我们会在 LIMIT 后面传两个参数,一个是偏移量(offset),一个是获取的条数
(limit)。当偏移量很小时,查询速度很快,但是当 offset 很大时,查询速度就会变慢。

优化方法
对于LIMIT分页查询的性能优化,主要思路是利用覆盖索引字段定位数据,然后再取出内容。
1)子查询分页方式

SELECT * FROM tbl_works
WHERE id >= (SELECT id FROM tbl_works limit 100000, 1)
LIMIT 20 // 54ms
子查询分页方式,首先通过子查询和覆盖索引定位到起始位置ID,然后再取所需条数的数据。

SELECT t1.* FROM tbl_works t1
WHERE t1.id in (SELECT t2.id from (SELECT id FROM tbl_works limit 100000, 10) as t2) // 53.9ms

2)join 分页方式
SELECT * FROM tbl_works t1
JOIN (SELECT id from tbl_works WHERE status=1 limit 100000, 10) t2 ON t1.id = t2.id // 53.6 ms

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务