随着数据库表的大小增加,我有以下查询开始变慢:
SELECT
t.*,
e.TranslatedValue AS EnglishValue
FROM (
SELECT DISTINCT PropertyKey
FROM Translations
) grouper
JOIN Translations t
ON t.TranslationId = (
SELECT TranslationId
FROM Translations gt
WHERE gt.PropertyKey = grouper.PropertyKey
AND gt.Locale = 'es'
AND gt.Priority = 3
ORDER BY gt.ModifiedDate DESC
LIMIT 1
)
INNER JOIN Translations e
ON t.EnglishTranslationId = e.TranslationId
ORDER BY t.ReviewerValidated, PropertyKey
首先,我选择翻译中的所有内容,加入自身以获得相应的英语值。
然后,我想将每个PropertyKey的结果限制为只有一个。这就像一个组,除了我需要选择一个特定的记录作为返回的记录(而不是组的方式只是给我找到它的第一个)。这就是为什么我有内部查询只返回一个TranslationId。
当我开始解释时,我得到以下信息:
有没有办法可以返回相同的结果集而不必让MySQL使用较慢的派生表?谢谢!
UPDATE :我创建了一个带有架构和示例数据的SQL Fiddle。您可以 为自己运行我的查询以查看它给出的结果。我需要成为 能够以更快的方式获得相同的结果。 http://sqlfiddle.com/#!2/44eb0/3/0
答案 0 :(得分:0)
我认为您希望在记录中匹配TranslatedValue
的给定本地和优先级的最新PropertyKey
。
如果是这样,以下操作使用单个相关子查询来执行您想要的操作:
select t.*,
(select t2.TranslatedValue
from Translations t2
where t.PropertyKey = t2.PropertyKey and
t2.Locale = 'es' and
t2.Priority = 3
order by t.ModifiedDate desc
limit 1
) as EnglishValue
from Translations t
having EnglishValue is not NULL
ORDER BY t.ReviewerValidated, PropertyKey;
(having
子句删除没有翻译的记录。)
如果是这样,那么Translations(PropertyKey, Locale, Priority, ModifiedDate)
上的索引应该可以加快查询速度。