У меня есть таблица items
и таблица item_attributes
.
Для простоты, скажем, у моего элемента таблицы есть столбец id
и столбец name
.Конечно, есть индекс по столбцу id
.
таблица item_attributes
содержит столбцы id
, item_id
, attribute_name
и attribute_value
и индекс ON attrubute_name
Теперь я хочу запросить все элементы с определенным атрибутом без использования объединения.
Я делаю это с помощью следующего запроса:
SELECT *
FROM items i
WHERE i.id IN (
SELECT item_id
FROM item_attributes a
WHERE a.attribute_name = 'SomeAttribute'
AND a.attribute_value = 'SomeValue'
)
сам подзапрос выполняется быстро.
Если я сначала выполню сам запрос и использую результат для запроса IN
SELECT *
FROM items i
WHERE i.id IN (1,3,5,7,10,...)
, это тоже быстро.
Однако объединенный запрос оченьочень медленно (> 2 сек.) Если я изучу план запроса, я пойму почему: MySQL выполняет полное сканирование таблицы таблицы элементов вместо того, чтобы сначала выполнить подзапрос и использовать результат для запроса индекса.
1, 'PRIMARY', 'items', 'ALL', '', '', '', '', 149726, 'Using where'
2, 'DEPENDENT SUBQUERY', 'item_attributes', 'index_subquery', 'IDX_ATTRIBUTE_NAME', 'IDX_ATTRIBUTE_NAME', '4', 'func', 1, 'Using where'
Есть ли способ оптимизировать этот запрос?Я знаю, что подзапрос всегда будет возвращать только небольшой набор результатов (<100 строк). </p>