此查询(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,我应该添加哪些索引?
答案 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)
上建立索引。