Как оптимизировать MySQL запрос, который содержит таблицу и левое соединение представления SQL - PullRequest
1 голос
/ 15 февраля 2011

У меня есть этот запрос:

SELECT a.id, b.discount FROM (a LEFT JOIN b ON b.id_a = a.id);

Команда EXPLAIN для этого запроса:

id  select_type   table  type   possible_keys   key       key_len  ref    rows   Extra
1    SIMPLE        a      index  NULL            PRIMARY   4        NULL   1489   Using index
1    SIMPLE        b      ALL    NULL            NULL      NULL     NULL   819   

A - это таблица с 1489 строками, а B - представление SQL.Теперь я понимаю, что MySQL должен делать 1489 * 819 операций, что является слишком неоптимизированной операцией.Если бы B был таблицей, я бы создал индекс для столбца id_a, но я понятия не имею, что делать с представлением SQL.

Кто-нибудь может помочь?

Ответы [ 3 ]

2 голосов
/ 15 февраля 2011

Я бы посмотрел на представление и попытался перейти к необработанным таблицам, которые определяют элемент, который вас интересует, существует или нет.И убедитесь, что корневая таблица представления «b» имеет индекс для этого ключа.

0 голосов
/ 15 февраля 2011

Переключение таблицы и представления может помочь.

пример:

SELECT a.id, b.discount FROM (b RIGHT JOIN a ON b.id_a = a.id);
0 голосов
/ 15 февраля 2011

Вместо того, чтобы работать с представлением (которое не индексируется), вы также можете попробовать создать временную таблицу с индексами.Мы сделали это для некоторых длинных запросов и в результате добились впечатляющих улучшений скорости (конечно, YMMV).

...