Что не так с моим запросом MySQL? - PullRequest
1 голос
/ 07 января 2009

Я не получаю никаких ошибок, так как это незначительная проблема с производительностью.

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). Почему это происходит, когда мне нужно выбрать только одно поле? Кто-нибудь может мне помочь?

Ответы [ 3 ]

6 голосов
/ 07 января 2009

ALL означает все строки, а не все столбцы. Поскольку он говорит, что нет возможных ключей, я думаю, у вас нет индекса для d.content_id или d.value_type или d.function.

Если вы хотите проявить фантазию, вы можете поместить индекс во все три столбца.

2 голосов
/ 07 января 2009

Индексируются ли поля d.value_type и d.function? Это было бы первичным инстинктом относительно причины.

1 голос
/ 08 января 2009

Добавление индекса из нескольких столбцов к table4 на основе столбцов content_type, value_type и function.

Ваш запрос не выбирает все столбцы из table4, он выбирает все строки; это не большая проблема, когда есть только два.

Обратите внимание, что план выполнения запросов MySQL может не дать ожидаемого ответа при работе с небольшим количеством записей; при таких обстоятельствах база данных может быстрее выполнить полное сканирование таблицы.

...