0

DB テーブルのサイズが大きくなるにつれて遅くなり始めている次のクエリがあります。

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 ごとに 1 つだけに制限します。これは group by に似ていますが、返されるレコードとして特定のレコードを選択する必要があります (group by では最初に見つかったレコードが返されるのではなく)。そのため、TranslationId を 1 つだけ返す内部クエリがあります。

Explain を実行すると、次の情報が得られます。

ここに画像の説明を入力

MySQL に遅い派生テーブルを使用させることなく、同じ結果セットを返す方法はありますか? ありがとう!

UPDATE : スキーマとサンプル データを使用して 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 に答える