2009-01-06 60 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查询执行计划可能无法给出您期望的答案;在这种情况下,数据库执行全表扫描的速度会更快。