Лучше нормализовать данные properties (prop_id, prop_name) properties_index(ware_id, prop_id, value) тогда и индекс будет работать, и на 101-м свойстве не обломитесь
А если ещё сделать частотную табличку заполнения свойств по товарам и аргументы сортировать в условии запроса в порядке возрастания частоты атрибута - то будет вполне резво работать даже на миллионах записей атрибутов.
так имею нормализованые данные уже (virtuemart, bitrix), но не суть что за движек - при таком способе хранения когда свойства хранятся отдельно, поиск по свойствам тормозит даже если поиск по id а не значению и оператору '=' а не 'like' и индесксы есть для id значений и id свойств и id товаров:
SELECT p.virtuemart_product_id, group_concat(DISTINCT pf_fcustom.custom_parent_id ORDER BY pf_fcustom.custom_parent_id) AS custom_fields_list FROM jos_virtuemart_products AS p LEFT JOIN jos_virtuemart_product_customfields AS pf_custom ON p.virtuemart_product_id = pf_custom.virtuemart_product_id LEFT JOIN jos_virtuemart_customs AS pf_fcustom ON pf_custom.virtuemart_custom_id = pf_fcustom.virtuemart_custom_id WHERE p.product_unit != '_srv' AND ( (pf_fcustom.virtuemart_custom_id = 65) OR (pf_fcustom.virtuemart_custom_id = 159) ) GROUP BY p.virtuemart_product_id HAVING custom_fields_list = '270,271' где
( ... )
Comments 6
properties (prop_id, prop_name)
properties_index(ware_id, prop_id, value)
тогда и индекс будет работать, и на 101-м свойстве не обломитесь
Reply
Reply
Reply
SELECT p.virtuemart_product_id,
group_concat(DISTINCT pf_fcustom.custom_parent_id
ORDER BY pf_fcustom.custom_parent_id) AS custom_fields_list
FROM jos_virtuemart_products AS p
LEFT JOIN jos_virtuemart_product_customfields AS pf_custom ON p.virtuemart_product_id = pf_custom.virtuemart_product_id
LEFT JOIN jos_virtuemart_customs AS pf_fcustom ON pf_custom.virtuemart_custom_id = pf_fcustom.virtuemart_custom_id
WHERE p.product_unit != '_srv' AND (
(pf_fcustom.virtuemart_custom_id = 65)
OR
(pf_fcustom.virtuemart_custom_id = 159)
)
GROUP BY p.virtuemart_product_id
HAVING custom_fields_list = '270,271'
где ( ... )
Reply
Leave a comment