Как правильно слепить таблицу характеристик в MySQL? Part 2

humbert
На сайте с 16.03.2006
Offline
540
260

Читал тут - /ru/forum/724080, все понятно.

Но тормозит запрос сильно.

Есть таблица товаров (items), с полями описания товара.

Есть отдельная таблица с характеристиками (characters). Поля там: id_item, id_char, value_char

Нужно выбрать товар по нескольким характеристикам.

Select Distinct i.* From items i

INNER JOIN mod_char_item mci3 on (mci3.id_char=3 and i.id_item=mci3.id_item and mci3.value_char>=0 and mci3.value_char<=101)

INNER JOIN mod_char_item mci2 on (mci2.id_char=2 and i.id_item=mci2.id_item and mci2.value_char>=0 and mci2.value_char<=94)

INNER JOIN mod_char_item mci10 on (mci10.id_char=10 and i.id_item=mci10.id_item and mci10.value_char>=0 and mci10.value_char<=10)

INNER JOIN mod_char_item mci9 on (mci9.id_char=9 and i.id_item=mci9.id_item and mci9.value_char>=0 and mci9.value_char<=10)

INNER JOIN mod_char_item mci4 on (i.id_item=mci4.id_item and mci4.id_char=4 and ( mci4.value_char='быстро тонущий'))

Limit 32

Если без Distinct, то выполняется быстро, но с ним более 8 секунд запрос считается.

Explain

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE mci4 ref id_item,value_char,id_char value_char 257 const 452 Using where; Using temporary
1 SIMPLE i eq_ref PRIMARY PRIMARY 4 fishingsale.mci4.id_item 1 Using where
1 SIMPLE mci9 ref id_item,value_char,id_char id_item 4 fishingsale.mci4.id_item 235 Using where; Distinct
1 SIMPLE mci10 ref id_item,value_char,id_char id_item 4 fishingsale.mci9.id_item 235 Using where; Distinct
1 SIMPLE mci3 ref id_item,value_char,id_char id_item 4 fishingsale.i.id_item 235 Using where; Distinct
1 SIMPLE mci2 ref id_item,value_char,id_char id_item 4 fishingsale.i.id_item 235 Using where; Distinct



---------- Добавлено 07.05.2013 в 12:02 ----------

P.s.

Заменил join на exists

Select i.* From items i where id_cat=3 and i.status_item=1 

and exists (Select mci4.id_item From mod_char_item mci4 where i.id_item=mci4.id_item and mci4.id_char=4 and ( mci4.value_char='быстро тонущий'))

and exists (Select mci3.id_item From mod_char_item mci3 where mci3.id_char=3 and i.id_item=mci3.id_item and mci3.value_char>=0 and mci3.value_char<=101)

and exists (Select mci2.id_item From mod_char_item mci2 where mci2.id_char=2 and i.id_item=mci2.id_item and mci2.value_char>=0 and mci2.value_char<=94)

and exists (Select mci10.id_item From mod_char_item mci10 where mci10.id_char=10 and i.id_item=mci10.id_item and mci10.value_char>=0 and mci10.value_char<=10)

and exists (Select mci9.id_item From mod_char_item mci9 where mci9.id_char=9 and i.id_item=mci9.id_item and mci9.value_char>=0 and mci9.value_char<=10) Limit 32

Раза в 4 ускорился запрос

Парсинг прайс-листов, наполнение интернет-магазина товаром. (https://humbert.ru) Любая CMS (Битрикс, OpenCart, Prestashop и даже Woo Commerce )

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий