MySQL Performance: упорядочение по содержимому объединенных таблиц - PullRequest
0 голосов
/ 09 мая 2018

Есть ли способ повысить производительность при заказе запросов на основе динамического подмножества таблицы большего размера?

Для справки у меня есть две таблицы:

  • продуктов - содержит информацию о продуктах, включая названия, цены и т. Д.
  • inventory_items - содержит текущие уровни запасов для различных продуктов от нескольких поставщиков.

Обычный запрос может выглядеть примерно так:

select (columns)
from inventory_items ii
left join products p on ii.product_id = p.id
where ii.vendor_id = 123
order by p.name
limit 100

Таким образом, мы можем увидеть строки из 50 000 строк, которые мы просматриваем из инвентаризации, которые могут быть связаны с 45 000 строками из таблицы продуктов. (В нашем случае необходимо левое соединение, так как у нас не всегда есть данные о продукте для всего в инвентаре поставщика.)

Это относительно медленно и трудно для индексации: запрос использует первичный ключ (id) таблицы продуктов для объединения, и я не думаю, что есть полезный индекс, который я мог бы добавить к этой таблице для повышения производительности при сортировке другой столбец в этой таблице (например, название продукта). В одном товаре «много» предметов инвентаря, поэтому я не могу просто добавить инвентаризацию_id в таблицу товаров.

В настоящее время я рассматриваю возможность денормализации таблицы, либо добавив нужные мне столбцы в таблицу inventory_items, либо создав новую таблицу для скомпилированных отчетов. Таким образом, я мог бы добавить индексы в таблицу inventory_items, такие как (vendor_id, name), которые помогли бы повысить производительность при сортировке по имени.

Есть ли лучший вариант здесь, чем денормализация? Кэширование затруднено, поскольку существует около десятка различных полей, по которым каждый отчет может быть отсортирован, результаты должны быть разбиты на страницы, и есть различные типы фильтров / поисков, которые пользователи могут применять к результатам.

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Пожалуйста, обратитесь к документации продукта (например) https://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html#order-by-index-use

В некоторых случаях MySQL может использовать индекс для удовлетворения предложения ORDER BY и избежать дополнительной сортировки, связанной с выполнением операции файловой сортировки.

Индекс также можно использовать, даже если ORDER BY не полностью совпадает с индексом, если все неиспользуемые части индекса и все дополнительные столбцы ORDER BY являются константами в предложении WHERE.

При сортировке можно использовать индекс, и если это так, то производительность сортировки улучшится.

Итак, в вашем примере индекс на p.name может улучшить производительность сортировки, однако единственный способ узнать, какие индексы используются и когда они используются, - это получить план объяснения.

0 голосов
/ 20 мая 2018
inventory_items needs INDEX(vendor_id)
...