1

我没有收到任何错误,因为这只是一个小性能问题。

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'

当我查看正在引用哪些表时,一切都很好,但是从应该只选择“值”字段的 table4 中,我得到了一个 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) 中选择 *。当我只需要从中选择一个字段时,为什么要这样做?谁能帮我吗?

4

3 回答 3

6

ALL表示所有行,而不是所有列。由于它说没有可能的键,我猜你在 d.content_id 或 d.value_type 或 d.function 上没有索引。

如果您想变得花哨,可以在所有 3 列中放置一个索引。

于 2009-01-06T22:26:38.567 回答
2

d.value_type 和 d.function 是索引字段吗?那将是对原因的最初直觉。

于 2009-01-06T22:26:48.163 回答
1

table4基于content_type,value_type和列添加多列索引function

您的查询不是从中选择所有列table4,而是选择所有行;当只有两个时,这不是什么大问题。

请注意,当您处理少量记录时,MySQL 查询执行计划可能不会给出您期望的答案;在这种情况下,数据库进行全表扫描会更快。

于 2009-01-08T07:26:28.510 回答