Mysql查询Mysql 5.5的建议

时间:2014-04-09 07:18:53

标签: mysql

我有以下查询在mysql 5.6中运行可爱,但在5.5中需要10秒才能执行,我知道旧版mysql版本中的NOT IN子句存在性能问题,但我没有看到另一种方法来处理它在旧的mysql版本中,我真的很感激任何建议:

SELECT 
DISTINCT C.chapter, 
J.name 
FROM chart as C 
INNER JOIN resume as J ON J.serie_id = C.serie_id 
WHERE chapter NOT IN 
(
  SELECT DISTINCT chapter FROM chart WHERE recorded = '0000-00-00'
) 
AND 
(
  C.chapter NOT IN 
  (
     SELECT chapter FROM chart_2
  )
) 
ORDER BY chapter DESC

Bassicly它的作用是从图表表中选择唯一的章节和连接表中的名称,然后再从图表表中选择具有日期的独特章节,这意味着还没有记录并执行匹配以使用NOT IT排除第一个子查询中的那些。我使用distinct,因为在图表中,章节可以重复多次,我只想选择那些记录为单个结果的章节(比如将它们分组)。最后,检查chart_2表中该章节是否存在。它在mysql 5.6上运行正常但在5.5中只需要很长时间。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

可能会尝试加入。

SELECT 
DISTINCT C.chapter, 
J.name 
FROM chart as C 
INNER JOIN resume as J ON J.serie_id = C.serie_id 
LEFT OUTER JOIN chart C1 ON C.chapter = C1.chapter AND C1.recorded = '0000-00-00'
LEFT OUTER JOIN chart_2 C2 ON C.chapter = C2.chapter 
WHERE C1.chapter IS NULL
AND C2.chapter IS NULL
ORDER BY C.chapter DESC

答案 1 :(得分:0)

我个人有这么多表现不佳的查询,我发现最好为in子句获取单独查询的值列表而不是使用子查询。

所以从SELECT DISTINCT章节中获取一组结果FROM chart WHERE recorded =' 0000-00-00' 和SELECT章节FROM chart_2,合并它们然后将它们添加到您的查询。