mysql in子句使用子查询列表 - 比硬编码列表慢得多的执行时间

时间:2014-04-01 23:37:40

标签: php mysql sql subquery query-optimization

我的查询看起来像这样(简化版)

SELECT 
  title,
  count(title) c,
  SUM(
    id IN 
    (SELECT 
      otherID 
    FROM
      otherTable 
    WHERE someTrait IN (18, 19, 29, 20, 21, 30))
  ) s 
from
  `TABLE` 
  GROUP BY title
  HAVING t-s > 0

运行前几次需要2秒钟,然后在缓存后大约.15秒内运行,但有时会在重复执行后反弹回2秒

现在,说我接受子查询

SELECT 
  otherID 
FROM
  otherTable 
WHERE someTrait IN (18, 19, 29, 20, 21, 30)

我得到的结果是.1秒。结果如下:

(1,27,145,600,1234)

所以我把它分成了这个

的原始查询
SELECT 
  title,
  count(title) t,
  SUM(id IN (1, 27, 145, 600, 1234)) s
FROM
  `TABLE`
GROUP BY title
HAVING t-s > 0

第一次运行需要0.6秒,然后在重复执行后需要0.05到0.15秒,但是从来没有像第一次查询那样达到完整的.6秒。

为什么MySQL需要更长的时间才能运行第一个查询?是否有正确的“MySql方式”来完成我所做的事情,即获取子查询的结果,保存它,并将其直接放入我的其他查询?

我正在使用php,所以目前我正在进行第一个查询,将结果存储到逗号分隔值字符串,并将其传递给第二个查询,但我觉得我在那里 应该是一个更好的方法,或者有一些关于我错过的MySql的关键点。

就此而言,我希望尽可能使用JOINLEFT JOIN代替IN,但因为它是SUM的论据,所以我没有'看看如何做到这一点。

0 个答案:

没有答案