0

MySQLが正しいフィールドにINDEX()を配置するのに少し問題があります。たとえば、次のようなクエリがあります。

SELECT m.id as mid,p.id as pid,po.* FROM m 
LEFT OUTER JOIN p ON p.mid = m.id AND p.uid = 2 
LEFT OUTER JOIN po ON po.mid = m.id AND po.uid = 2 
ORDER BY m.date,m.time

そして、私は次のインデックスを持っています:

  • m.date
  • m.time
  • p.mid
  • p.uid
  • po.mid
  • po.uid

ただし、EXPLAINクエリを実行すると、どのキーも取得されません。ステートメントを入れようとしましFORCE INDEXたが、MySQLはそれらを拒否し続けます(クエリに構文エラーがあると言っています)。何か案は?

編集

これがEXPLAIN

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  m   ALL NULL    NULL    NULL    NULL    31  Using filesort
1   SIMPLE  p   ref mid,uid mid 5   db.m.id 1   
1   SIMPLE  po  ref uid,mid uid 5   const   1   

pとpoは現在正常に処理されていますが、mはまだ正常に処理されていないことに注意してください。mにINDEX(日付、時刻)を追加しましたが、それでも同じです。

4

2 に答える 2

1

FORCE INDEXは通常、テーブル名の後に使用されます。

... FROM <table_name> FORCE INDEX (<index_name>)

しかし、私はそれを使用することをお勧めしません。インデックスを使用して注文する場合は、複合インデックスIDX_date_time on(m。date、m。time)を作成できます。

于 2012-05-21T07:51:43.473 に答える
0

次のようなインデックスが必要です。

  1. (p.mid, p.uid)-化合物1
  2. (po.mid, po.uid)-別の化合物
  3. (m.date, m.time)-別の化合物

PS:このクエリで各テーブルの行がどれだけ(パーセンテージで)選択されていますか?値が大きい(30%を超える)場合-mysqlは意図的にインデックスを使用しません

于 2012-05-09T23:17:03.143 に答える