使用filesort,子查询不使用它来加入

时间:2015-04-05 22:34:36

标签: mysql join indexing subquery filesort

此查询(JOIN):

SELECT DISTINCT Token
FROM ID
INNER JOIN Tokens ON ID.Token_ID = Tokens.Token_ID
WHERE ID.Type =  'org'
OR (
ID.Type =  'lemma'
AND Tokens.Value <3
)
ORDER BY ID.Token_ID
LIMIT 200

正在使用filesort。此查询(SUBQUERY):

SELECT DISTINCT Token
FROM ID
WHERE TYPE =  'org'
OR (

TYPE =  'lemma'
AND Token_ID
IN (

SELECT Token_ID
FROM Tokens
WHERE Value <3
)
)
ORDER BY Token_ID
LIMIT 200

未使用filesort。我知道JOIN应该比子查询更快,所以我认为我需要一些额外的索引:为了不在连接查询中使用filesort,我应该添加哪些索引?

1 个答案:

答案 0 :(得分:0)

以下是查询的略微变化:

SELECT Token
FROM ID
WHERE TYPE =  'org'
UNION
SELECT Token
FROM ID
WHERE TYPE =  'lemma' AND
      EXISTS (SELECT t.Token_ID
              FROM Tokens t
              WHERE t.Token_ID = ID.Token_ID AND t.Value < 3
             )
ORDER BY Token
LIMIT 200;

变体是ORDER BY使用Token而不是Token_ID。后者真的没有意义,我很惊讶它不会产生错误。

对于此查询,您希望在ID(type, Token_Id, Token)ID(Type, Token)以及Tokens(Token_Id, Value)上建立索引。