我有以下查询在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中只需要很长时间。有什么想法吗?
答案 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,合并它们然后将它们添加到您的查询。