2016-10-27 4 views
1

次のMYSQL文を実行しますが、10行を返しますが、10秒以上を費やします。ところで、LIMIT 0、10を削除すると、1,000,000行が返されます。私はSceneCode列に対してIndex1を作成し、ProviderId列に対してIndex2を作成しました。制限文のパフォーマンスチューニング方法は?

SELECT * 
FROM 
(SELECT * FROM gf_sceneprovider WHERE SceneCode='DL00000003' ) AS sprovider 
    LEFT JOIN (SELECT * FROM gf_sceneprovidertemplate WHERE SceneCode='DL00000003'  ) AS stemplate 
ON sprovider.ProviderId = stemplate.ProviderId 
    INNER JOIN gf_provider AS provider 
ON provider.ProviderId = sprovider.ProviderId 
LIMIT 0, 10 

enter image description here

+0

したがって、ルールなしで10個のレコードを取得したいですか?もしそうなら、おそらくあなたは左の結合の前に 'gf_sceneprovider'を制限しようとすることができます – Prisoner

答えて

2

私は直接の賛成でサブクエリを廃止するだろう加わり:

その後
SELECT * 
FROM gf_sceneprovider sprovider 
LEFT JOIN gf_sceneprovidertemplate stemplate 
    ON sprovider.ProviderId = stemplate.ProviderId 
INNER JOIN gf_provider AS provider 
    ON provider.ProviderId = sprovider.ProviderId 
WHERE sprovider.SceneCode = 'DL00000003' AND 
     stemplate.SceneCode = 'DL00000003' 
LIMIT 0, 10 

を、可能な場合は結合列にインデックスを追加します。元のサブクエリによって、gf_sceneproviderおよびテーブルのインデックスが効果的に使用されないことがあります。この理由は、サブクエリが基本的にオンザフライのテーブルを作成するため、選択するテーブルとは異なり、インデックスがないからです。私はいくつかのシナリオではRDMBSがこれに対処できると思いますが、ここではそうではないようです。

+0

は素晴らしいです!今あなたの文は非常に速いです。元のサブクエリがなぜgf_sceneproviderとgf_sceneprovidertemplateテーブルのインデックスを効果的に使用できないのか分かりますか? – Jason

+0

はい、私はちょうどそれをupvote、理由を教えてください。 – Jason

+0

@ジェイソン私はあなたに理由を与え、私の答えの一番下を読んでください。あなたのケースでは、臨時/中間テーブルにインデックスはありません。 –

関連する問題