双内连接太慢

时间:2015-03-02 16:39:46

标签: mysql performance inner-join

嘿,我一直在四处寻找,无法找到问题的解决方案。 我有一个营养数据库,有3个表。所有3个表都具有单个项目的名称,营养成分和计量单位。我想要返回单一营养素含量最高的物品,即。蛋白。

我当前的查询大约需要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

2 个答案:

答案 0 :(得分:0)

WHERE nutr_def.NutrDesc="Vitamin D"请求INDEX(NutrDesc)。因此,假设优化器以nutr_def开头,那么它需要转到需要INDEX(Nutr_No)的nut_data,然后转到需要INDEX(NDB_No)的food_des。

如果优化器选择以ORDER BY开头,那么INDEX(Nutr_Val)将是有益的。 (请在使用JOIN时限定字段!我们无法判断哪个表位于!)因此,如果它以该表开头,请按照JOIN查看其他两个表需要哪些索引。

如果您需要进一步讨论,请提供SHOW CREATE TABLEEXPLAIN SELECT...

答案 1 :(得分: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

然后决定要添加索引的位置