У меня есть таблица 1 и таблица 2.производительность MySQL, внутреннее соединение, как избежать использования временных и FileSort
Таблица 1 PARTNUM - ID_BRAND partnum является первичным ключом id_brand является "индексированный"
Таблица 2 iD_BRAND - BRAND_NAME id_brand является первичным ключом BRAND_NAME является "индексируется"
в таблице 1 содержится 1 млн записей и таблица 2 содержит 1.000 записей.
Я пытаюсь оптимизировать некоторый запрос, используя EXPLAIN, и после многих попыток я достиг тупика.
EXPLAIN
SELECT pm.partnum, pb.brand_name
FROM products_main AS pm
LEFT JOIN products_brands AS pb ON pm.id_brand=pb.id_brand
ORDER BY pb.brand ASC
LIMIT 0, 10
Запрос возвращает этот план выполнения:
ID, SELECT_TYPE, TABLE, TYPE, POSSIBLE_KEYS, KEY, KEY_LEN , REF, ROWS, EXTRA
1, SIMPLE, pm, range, PRIMARY, PRIMARY, 1, , 1000000, Using where; Using temporary; Using filesort
1, SIMPLE, pb, ref, PRIMARY, PRIMARY, 4, demo.pm.id_pbrand, 1,
Оптимизатор запросов MySQL показывает временную + FileSort в плане исполнения. Как я могу избежать этого?
«ЗЛО» находится в ORDER BY pb.brand ASC. Заказ на это внешнее поле, по-видимому, является узким местом.
Какие индексы у вас есть в этих таблицах? – eillarra
Угадайте, если у вас нет индекса на pb.brand, то mysql нужно будет отсортировать все строки 1M до применения предела – StuartLC
ТАБЛИЦА 1: PARTNUM - это PK, а ID_BRAND - это индекс для ускорения ТАБЛИЦА2: ID_BRAND - это PK и BRAND - это индекс для ускорения – Vincenzo