在MySQL中如何使优化limit分页查询
https://blog.csdn.net/lxw1844912514/article/details/100029337
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