2012-05-09 6 views
0

MySQLにINDEX()を適切なフィールドに追加するのに少し問題があります。私は、このような何か例えば、なりクエリを持っています。JOINedクエリのMySQL FORCE 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はそれらを拒否し続けます(クエリに構文エラーがあると言っています)。何か案は?

EDIT

はここ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(日付、時刻)を追加しただけで、同じことができました。

+0

テーブルに31行しかないようです。 MySQLがどのようにクエリを実行しているかの問題は何ですか? EXPLAIN計画が何であれ、それは速くなければなりません。 –

答えて

1

FORCEのINDEXは、通常、テーブル名の後に使用されるインデックスを使用していないしかし、私はそれを使用することはお勧めしません。 。インデックスを使用して注文する場合は、複合インデックスIDX_date_time(m。date、m。time)を作成することができます。

0

あなたは、このようなインデックスを持っている必要があります。

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

PS:どのくらい(の割合で)がこのクエリで選択されていますか?値が(30%以上)大きい場合 - その後、MySQLはすなわち

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

、意図的に

+0

それでALTER TABLE p ADD INDEX(mid、uid)を実行すると、自動的にそれを拾うでしょうか? – Doa

+0

パーセンテージ:mはすべての行です.poとpは偶数です。 – Doa

+0

@Dow:それは多くのことに依存しますが、答えで述べたインデックスのセットは、そのようなクエリの推奨セットです。 – zerkms

関連する問題