1

次のクエリを最適化して速度を上げる方法はありますか? 実行には約6秒かかります。各テーブルには約 1000 レコードしか含まれていないため、巨大ではありません。

SELECT c. * , q.qualification_name, CONCAT( u.firstname, ' ', u.lastname ) AS name, v.venue_name, v.address_town
FROM p_courses c
LEFT JOIN p_qualifications q ON c.qualification_name = q.ref
LEFT JOIN p_users u ON c.instructor_number = u.instructor_number
LEFT JOIN p_venues v ON c.venue_token = v.token
WHERE (
c.status = 'completed'
OR c.status = 'confirmed'
)

上記のクエリは機能し、要求どおりにすべてのデータを取得します。複数の LEFT JOIN を追加するとすぐに時間がかかります。

ありがとう。

編集済み。

クエリの前に EXPLAIN を追加すると、これが返されます...

id  select_type table   type    possible_keys   key   key_len   ref     rows    Extra
1   SIMPLE      c       ALL     NULL            NULL  NULL      NULL    1288    Using where
1   SIMPLE      q       ALL     NULL            NULL  NULL      NULL    21   
1   SIMPLE      u       ALL     NULL            NULL  NULL      NULL    518  
1   SIMPLE      v       ALL     NULL            NULL  NULL      NULL    669

申し訳ありませんが、それをどのように解釈するかはよくわかりません。

4

2 に答える 2

0

投稿したExplainから、クエリがインデックスを使用しているようには見えません。q.ref、u.instructor_number、v.tokenがインデックスに登録されていることを確認します

于 2012-04-26T11:08:15.357 に答える
0
  1. EXPLAINクエリの前に置いて、何が問題なのかを確認してください。
  2. インデックスを設定して、結合と場所でそれらを使用できるようにします。
  3. EXPLAINもう一度確認してください
  4. 泡立てて、すすぎ、繰り返します。

ヒント: おそらく以下のインデックスが必要です:

c.qualification_name 
q.ref
c.instructor_number 
u.instructor_number
c.venue_token 
v.token
c.status
于 2012-04-26T11:00:16.780 に答える