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