2012-05-09 11 views
0

我正在讓MySQL在正確的字段上放置一個INDEX()有點麻煩。我有一個查詢,看起來,例如,像這樣:MySQL FORCE INDEX在JOINed查詢中的位置

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添加了一個INDEX(日期,時間),而且還是一樣。

+0

看起來你只有31行在表中。 MySQL如何執行查詢有什麼問題?無論解釋計劃是什麼,它都應該很快。 –

回答

1

力量指數表名後通常使用,即

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

但我不建議使用它。如果您希望使用索引對其進行排序,則可以在(m。date,m。time)上創建複合索引IDX_date_time。

0

你需要有這樣的索引:

  1. (p.mid, p.uid) - 化合物中的一個
  2. (po.mid, po.uid) - 另一種化合物一個
  3. (m.date, m.time) - 另一種化合物一個

PS:多少(以百分比)的每個表中的行是用這個查詢來選擇的?如果該值大(超過30%) - 那麼MySQL不使用索引故意

+0

因此,如果我會執行ALTER TABLE p ADD INDEX(mid,uid),它會自動提取它? – Doa

+0

百分比:m是所有行,po和p只有一對。 – Doa

+0

@Dow:它依賴於很多東西,但是我在回答中提到的一組索引是針對這樣的查詢的推薦集合 – zerkms