Есть ли способ повысить производительность при упорядочении запросов на основе динамического подмножества более крупной таблицы?
Для справки у меня есть две таблицы:
- 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), которые помогли бы повысить производительность при сортировке по имени.
Есть ли здесь лучший вариант, чем денормализация? Кэширование затруднено, потому что существует около дюжины различных полей, по которым каждый отчет может быть отсортирован, результаты должны быть разбиты на страницы, и существуют различные типы фильтров/поиска, которые пользователи могут применять к результатам.