Производительность MySQL: сортировка по содержимому объединенных таблиц

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

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

  • products – содержит сведения о продуктах, включая названия, цены и т. д.
  • 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 тысяч строк, которые мы просматриваем из inventory_items, которые могут быть связаны с 45 тысячами строк из таблицы products. (В нашем случае необходимо левое соединение, так как у нас не всегда есть данные о продуктах для всего ассортимента поставщика.)

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

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

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


person Matt    schedule 09.05.2018    source источник
comment
Единственный способ узнать наверняка — получить собственный план объяснения из запроса до и после создания индексов. Поможет индекс любого столбца, используемого в соединении, а также другие столбцы, используемые в предложении where. Индекс на p.name может ускорить сортировку. См. stackoverflow.com/questions /6858844/   -  person Paul Maxwell    schedule 20.05.2018


Ответы (2)


См. документацию по продукту (например) 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 может улучшить производительность сортировки, однако единственный способ узнать, какие индексы используются и когда они используются, — это получить план объяснения.

person Paul Maxwell    schedule 20.05.2018

person    schedule
comment
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и/или как этот код отвечает на вопрос, повышает его ценность в долгосрочной перспективе. - person MAGA; 20.05.2018