如何优化连接自身的MySQL查询并执行“自定义”组?

时间:2013-05-09 15:28:06

标签: mysql query-optimization

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

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。

当我开始解释时,我得到以下信息:

enter image description here

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

  

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

1 个答案:

答案 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)上的索引应该可以加快查询速度。