0

随着数据库表大小的增加,我有以下查询开始变慢:

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

首先,我从 Translations 中选择所有内容,并与它自身相结合以获得相应的英文值。

然后,我想将结果限制为每个 PropertyKey 一个。这就像一个 group by,除了我需要选择一个特定的记录作为返回的记录(而不是 group by 只给我它找到的第一个记录)。这就是为什么我有只返回一个 TranslationId 的内部查询。

当我运行解释时,我得到以下信息:

在此处输入图像描述

有没有一种方法可以返回相同的结果集而不必让 MySQL 使用较慢的派生表?谢谢!

更新:我创建了一个带有模式和示例数据的 SQL Fiddle。您可以自己运行我的查询以查看它给出的结果。我需要能够以更快的方式获得相同的结果。http://sqlfiddle.com/#!2/44eb0/3/0

4

1 回答 1

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)应该会加快查询速度。

于 2013-05-09T15:44:23.147 回答