Mysql子查询很长的工作

时间:2016-07-18 10:11:44

标签: mysql

我有下一个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秒

如何解决这个问题?

3 个答案:

答案 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)