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是普通索引

有没有好的办法优化的?

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 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年前

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