У меня есть следующая структура таблицы, которую я пытаюсь оптимизировать:
stores
------------
id | address
products
------------------------
id | name | type | price
Теперь у меня есть хранимая процедура, которая создает временную таблицу store_products
:
store_products
-----------------------------------
id | store_id | product_list | type
И код, который заполняет временную таблицу store_products
:
INSERT into store_products
SELECT (
(100+s.id) AS id,
s.store_id AS store_id,
'books' AS type,
IFNULL(CONCAT(',', CONCAT(GROUP_CONCAT(DISTINCT p.name ORDER BY p.name),',')),'') AS store_products
FROM
stores s
LEFT JOIN products p on p.type = 'books'
INSERT into store_products
SELECT (
(200+s.id) AS id,
s.store_id AS store_id,
'fruits' AS type,
IFNULL(CONCAT(',', CONCAT(GROUP_CONCAT(DISTINCT p.name ORDER BY p.name),',')),'') AS store_products
FROM
stores s
LEFT JOIN products p on p.type = 'fruits'
Теперь у меня есть несколько запросов от store_products
, которые выглядят так:
SELECT store_id FROM product_list WHERE FIND_INSET('product', product_list)
Это приводит к снижению производительности, так как FIND_INSET () не использует индексы.
Одна идея, которую мне пришлось решить, это использовать какую-то таблицу «многие ко многим» для хранения этой связи между продуктом и магазином. Но я не знаю, как создать его как часть хранимой процедуры.
Может быть, есть еще идеи, как это оптимизировать?