mysql 大数据表 order by + limit 导致查询缓慢问题

数据表有200万行,单表分页查询,当offset 2002470 很大的时候 加上 order by 很慢很慢

sql:

SELECT
table1.id
FROM
table1
INNER JOIN table2 ON table1.id = table2.id
ORDER BY
start_time DESC

LIMIT 1 OFFSET 2002470

其中start_time是普通索引

有没有好的办法优化的?

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 8

show your tables!!!

1年前 评论

start_time 如果是不重复的
第一页查询

SELECT
table1.id
FROM
table1
INNER JOIN table2 ON table1.id = table2.id
ORDER BY
start_time DESC
LIMIT 10

每次将第十条记录的 start_time 记作last_time 作为下次查询的条件
以后得每一页

SELECT
table1.id
FROM
table1
INNER JOIN table2 ON table1.id = table2.id
WHERE start_time < last_time
ORDER BY
start_time DESC
LIMIT 10

如果start_time 是大量重复的,或许可以 考虑联合 id 一起作为查询条件,或者是冗余一个新的字段(例如将start_time 的精度放大一些)

1年前 评论

数据量大慢主要是2个,1是统计count() 慢,2是分页分到最后慢, 解决就是1不用count了,不要总数,2是用id来分页,每次记录每页的最后一个id 然后条件上多加一个id > $id 你这200万还不算多,上千万后count首次统计慢得要死,count只要有数据变化就会从新来一次不走缓存,慢得一屁

1年前 评论
test2018

很奇怪 : 这个sql 运行 只要 0.564s


SELECT
  `table1`.id
FROM
  `table1`
INNER JOIN `table2` ON `table1`.`p_id` = `table2`.`p_id`
ORDER BY
  `start_time` DESC,
  `table1`.`id` DESC
LIMIT 10 OFFSET 67000

我给OFFSET增加到68000 就用了6秒多 是什么瓶颈导致的呢?

受影响的行: 0 时间: 6.429s

1年前 评论
test2018 (作者) (楼主) 1年前

可以用id > x and id < x去优化下分页

1年前 评论

查单张表,把 另一张表id取出来,map 把数据映射上去呗

1年前 评论
test2018 (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!