我有下一个mysql查询
SELECT DISTINCT * FROM dom_small WHERE count>=0 AND dom NOT IN
(SELECT dom FROM dom_small WHERE was_blocked=1)
ORDER BY count DESC LIMIT 30 OFFSET 4702020
当我越来越多地增加OFFSET时,子查询会长时间运行。
当OFFSET 0 mysql查询加载0秒但是当4702020 mysql查询加载1分19,49秒
如何解决这个问题?
答案 0 :(得分:0)
使用子查询
可以产生相同的结果SELECT DISTINCT * FROM dom_small WHERE count>=0 AND was_blocked=1
ORDER BY count DESC LIMIT 30 OFFSET 4702020;
答案 1 :(得分:0)
使用以下查询:
SELECT DISTINCT * FROM dom_small WHERE count>=0 AND dom NOT IN
(select * from(SELECT dom FROM dom_small WHERE was_blocked=1) t1 )
ORDER BY count DESC LIMIT 30 OFFSET 4702020
它可以通过缓存子查询结果来加速性能。我之前使用过这种方法,对我帮助很大。
但是正如其他人提到的那样使用大数字偏移会降低性能。
答案 2 :(得分:0)
SELECT DISTINCT * FROM dom_small WHERE count> = 0 AND dom NOT IN (SELECT dom FROM dom_small WHERE was_blocked = 1) ORDER BY count DESC LIMIT 30 OFFSET 4702020
虽然其他评论是准确的,但我能提供的唯一建议是您的distinct和子查询来自同一个表“dom_small”。此外,您没有进行任何聚合计数(*)与表中名为count的实际列。
那就是说,我会有一个索引来帮助优化查询
String#valueOf(Object)