2009-01-06 82 views
1

我沒有收到任何錯誤,因爲這只是一個小問題。我的MySQL查詢有什麼問題?

EXPLAIN 
SELECT 
a.nid, 
a.title, 
a.uid, 
b.parent, 
b.weight, 
c.name, 
d.value 
FROM table1 AS a INNER JOIN table2 AS b ON a.vid = b.vid AND a.status = 1 
INNER JOIN table3 AS c ON c.uid = a.uid 
INNER JOIN table4 AS d ON d.content_id = a.nid AND d.value_type = 'percent' AND d.function = 'average' 

當我看到這表被引用,一切都很好,但是從表4,它應該只選擇「值」字段中,我發現了一個ALL被稱爲...

id select_type  table type  possible_keys         key  key_len ref     rows Extra 
1 SIMPLE   a  ref  PRIMARY,vid,status,uid,node_status_type,nid status 4   const     1  
1 SIMPLE   b  eq_ref PRIMARY           PRIMARY 4   databasename.a.vid 1  
1 SIMPLE   c  eq_ref PRIMARY           PRIMARY 4   databasename.a.uid 1 Using where 
1 SIMPLE   d  ALL  NULL           NULL  NULL  NULL     2  Using where 

正如你所看到的,它從決賽桌(d)中選擇*。爲什麼當我只需要從中選擇一個字段時這樣做?誰能幫我嗎?

+0

非常感謝!我已經完成了所有三個主要工作,現在它工作了!也許我應該閱讀這個索引... 再次感謝! – 2009-01-06 22:30:42

+0

什麼是以前的主要?有另一個獨特的索引嗎?只需使用通用的非唯一索引即可獲得相同的效果。如果nid是唯一的,那麼它應該仍然是主要的,以實現唯一性。 – dkretz 2009-01-06 22:36:46

+0

你爲什麼回滾標籤?這個問題與PHP無關...... – 2009-01-12 02:51:18

回答

6

ALL表示所有行,而不是所有列。既然它說沒有可能的鍵,我猜你沒有d.content_id或d.value_type或d.function的索引。

如果您想要看起來很漂亮,那麼您可以在所有這三列中加上一個索引。

2

d.value_type和d.function索引字段?這將是最初的本能。

1

根據content_type,value_typefunction列添加多列索引到table4

您的查詢不是從table4中選擇所有列,而是選擇所有行;當只有兩個時,這不是什麼大問題。

請注意,當您使用少量記錄時,MySQL查詢執行計劃可能無法給出您期望的答案;在這種情況下,數據庫執行全表掃描的速度會更快。