0

このクエリを最適化しようとしています

SELECT gwt.z, gwt.csp, gwt.status, gwt.cd, gwt.disp, gwt.5d, gwt.6d, gwt.si, gwt.siad, gwt.prbd, 
  CONCAT(gwt.1, gwt.2, gwt.3, gwt.4, gwt.5, gwt.6, gwt.7, gwt.8, gwt.9), 
  group_concat(gws.res order by line_no), gwt.scm, gm.me, gwt.p, gwt.scd 
from gwt 
left outer join gws on gwt.csp = gws.csp 
left join gm on gwt.scm = gm.mid 
where gwt.zone = 1 
  and (status like '1%' or status like '2%' or status like '3%' or 
       status like '4%' or status like '5%' or status like '6%') 
group by gwt.csp

EXPLAIN を使用すると、gwt には 4110 行、gws には 920k 行、gm には 2800 行が含まれます。

1% などのステータスのみをクエリしていた場合、クエリは正常に読み込まれましたが、表示するステータスを追加したため、タイムアウト エラーが発生しました。

説明

4

2 に答える 2

2

私は次のことを提案します。

各テーブルに、主キーのように見えるインデックスがあることを確認してください。

  • gwt.csp
  • gm.mid

gwtの場合、(zone、status)に別のインデックスを作成し、結合条件を次のように変更します。

gwt.zone = 1 and status >= '1' and status < '7'

これはリストと同等ですが、実行エンジンがインデックスを使用できるようになります。

クエリを修正するにはそれで十分かもしれません。最後に、gws.cspにインデックスを付けて、処理速度が上がるかどうかを確認できます。

「csp」は1対1の関係ですか?そうでない場合は、クエリが巨大な結果セットを作成する際に問題が発生する可能性があります。

于 2012-08-20T18:07:28.687 に答える
1

gwsテーブルには、他のテーブルよりも 2 桁多い行があるため、これに注目する必要がありますこの特定のクエリを対象とするインデックスを設計する場合、最初の手順は簡単です。つまり、結合された列 (gws.csp) にインデックスを追加し、選択したすべての列 (gws.res および gws.line_no(?)) をインデックスに含めるようにします。

上記により、クエリの速度が劇的に向上するはずです。2 番目の懸念は、gwtテーブルに最初の列として ステータスを持つインデックスがあることを確認することです。

于 2012-08-20T17:36:34.950 に答える