Что не так с моим запросом MySQL?
-
03-07-2019 - |
Вопрос
Я не получаю никаких ошибок, так как это незначительная проблема с производительностью.
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, где следует выбирать только значение " значение " поле, я получаю ВСЕ называемое ...
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). Почему это происходит, когда мне нужно выбрать только одно поле? Кто-нибудь может мне помочь?
Решение
ALL
означает все строки, а не все столбцы. Поскольку в нем говорится, что нет возможных ключей, я предполагаю, что у вас нет индекса для d.content_id или d.value_type или d.function.
Если вы хотите проявить фантазию, вы можете поместить индекс во все эти три столбца.
Другие советы
Индексируются ли поля d.value_type и d.function? Это было бы первичным инстинктом относительно причины.
Добавьте многостолбцовый индекс в table4
на основе столбцов content_type
, value_type
и function
. р>
Ваш запрос не выбирает все столбцы из table4
, он выбирает все строки; это не большая проблема, когда есть только два.
Обратите внимание, что план выполнения запросов MySQL может не дать ожидаемого ответа при работе с небольшим количеством записей; при таких обстоятельствах база данных может быстрее выполнить полное сканирование таблицы.