Попытка улучшить медленный запрос путем добавления индексов в MySQL - PullRequest
0 голосов
/ 24 октября 2019

Для следующего запроса я попытался создать индекс для row_id, created_in, updated_in, а также entity_id, row_id, created_in, updated_in. В обоих случаях индекс игнорируется.

SELECT `e`.`entity_id`
  FROM
    `catalog_product_super_link`          AS `l`
      INNER JOIN `catalog_product_entity` AS `e`
                 ON `e`.`row_id` = `l`.`parent_id`
                   AND (`e`.`created_in` <= 2147483647 AND `e`.`updated_in` > 1)
  WHERE
    (`l`.`product_id` IN (5528, 5529, 5530, 5531, 5532, 5533, 5534, 5535, 5540, 5541))

EXPLAIN сообщает, что мои ключи возможны, но он выбирает Using where

В производстве продукта) id IN список может быть намного больше.

1 Ответ

0 голосов
/ 25 октября 2019

Я бы создал (row_id) или (row_id, entity_id) для catalog_product_entity таблицы и (product_id, row_id) для catalog_product_super_link таблицы.

НеОбязательно, если created_in и updated_in должны быть включены в первый индекс, так как я не знаю, сколько строк можно отфильтровать с помощью предоставленных критериев.

Согласно результатам EXPLAIN (обычно это хорошая идея предоставитьво многих случаях оптимизатор (и ОБЪЯСНЯЕТ) будет выбирать разные планы на основе имеющихся у вас данных / статистики. Если в каждой таблице всего ~ 100 строк, быстрее получить все данные и отфильтровать их на месте, чем использовать index => поиск данных.

Таким образом, вы должны заполнить свою БД немного реалистичными данными, прежде чем пытатьсяоптимизировать на основе результатов EXPLAIN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...