2015-03-02 83 views
0

嘿,我一直在四處尋找,無法找到解決我的問題。 我有一個營養數據庫,有3個表。所有3個表格都有單個項目的名稱,營養成分和計量單位。我想要返回單個營養素含量最高的物品,即。蛋白。Double Inner Join太慢

我當前的查詢大約需要3秒鐘才能獲得條目,這將是一個問題,因爲我將在頁面中多次查詢多個營養素。任何幫助表示讚賞。

food_des - about 8,000 entries 
+-------+---------+--------+ 
|NDB_No |Long_Desc|Fd_Group| 
+-------+---------+--------+ 
|01001 |Banana |0100 | 
|01002 |Apple |0102 | 
+-------+---------+--------+ 

nut_data - about 600,000 entries 
+-------+-------+--------+ 
|NDB_No |Nutr_No|Nutr_Val| 
+-------+-------+--------+ 
|01001 |318 |55.5 | 
|01001 |320 |1.1  | 
|01002 |318 |30.2 | 
|01002 |325 |12.3 | 
+-------+-------+--------+ 

nut_def - about 150 entries 
+-------+--------+-----+ 
|Nutr_No|NutrDesc|Units| 
+-------+--------+-----+ 
|318 |Carbs |g | 
|319 |Energy |kcal | 
|320 |Protein |g | 
|325 |Iron |mg | 
+-------+--------+-----+ 

SELECT food_des.Long_Desc, nut_data.Nutr_Val, nutr_def.Units 
FROM food_des 
INNER JOIN nut_data 
ON food_des.NDB_No=nut_data.NDB_No 
INNER JOIN nutr_def 
ON nut_data.Nutr_No=nutr_def.Nutr_No 
WHERE nutr_def.NutrDesc="Vitamin D" 
ORDER BY Nutr_Val DESC 
LIMIT 5 
+0

你有你的表定義哪些索引? – eggyal 2015-03-02 16:40:38

+0

對不起,唯一的索引是NDB_No在表中food_des – prince888 2015-03-02 17:01:21

+0

你真的應該索引'nut_data':我建議至少一個簡單的索引超過'(NDB_No)',儘管一個最優方法可能涉及一個複合超過' NDB_No,Nutr_No)'和'nutr_def.Nutr_No'上的索引。如果您發現後續的性能仍然不可接受,請發佈您的執行計劃(「'EXPLAIN SELECT ...'」),我們可以考慮添加一些覆蓋索引。 – eggyal 2015-03-02 17:05:21

回答

0

WHERE nutr_def.NutrDesc="Vitamin D"請求INDEX(NutrDesc)。因此,假設優化器以nutr_def開頭,那麼它將需要移動到nut_data,這將需要INDEX(Nutr_No),然後到food_des,需要INDEX(NDB_No)

如果優化器選擇以ORDER BY開頭,那麼INDEX(Nutr_Val)將是有益的。 (請在使用JOIN時限定字段!我們無法確定哪個表在!)因此,如果它以該表開始,請按照JOIN查看其他兩個表上需要的索引。

如果您需要進一步討論,請提供SHOW CREATE TABLEEXPLAIN SELECT...

0

運行此

EXPLAIN SELECT food_des.Long_Desc, nut_data.Nutr_Val, nutr_def.Units 
FROM food_des INNER JOIN nut_data 
ON food_des.NDB_No=nut_data.NDB_No 
INNER JOIN nutr_def 
ON nut_data.Nutr_No=nutr_def.Nutr_No 
WHERE nutr_def.NutrDesc="Vitamin D" 
ORDER BY Nutr_Val DESC 
LIMIT 5 

然後決定你要添加索引

+0

我 SELECT_TYPE |表|類型| possible_keys |關鍵| key_len |裁判|行 SIMPLE | nutr_def |裁判| PRIMARY,NutrDesc | NutrDesc | 62 |常量| 2 SIMPLE | food_des | ALL |主| NULL | NULL | NULL | 7771 SIMPLE | nut_data | eq_ref | PRIMARY,NDB_No |主| 12 | info.food_des.NDB_No,info.nutr_def.Nutr_No | 1 對不起它看起來有點凌亂 – prince888 2015-03-02 19:41:52

+0

看起來你還沒有INDEX( NDB_No)關於food_des。 – 2015-03-05 02:24:49