У меня есть три таблицы
filters (id, name)
items(item_id, name)
items_filters(item_id, filter_id, value_id)
values(id, filter_id, filter_value)
около 20000 записей в пунктах.около 80000 записей в items_filters.
SELECT i.*
FROM items_filters itf INNER JOIN items i ON i.item_id = itf.item_id
WHERE (itf.filter_id = 1 AND itf.value_id = '1')
OR (itf.filter_id = 2 AND itf.value_id = '7')
GROUP BY itf.item_id
WITH ROLLUP
HAVING COUNT(*) = 2
LIMIT 0,10;
Это 0,008 раза, когда есть записи, которые соответствуют запросу, и 0,05, когда нет записей.
Я пробовал разные варианты раньше:
SELECT * FROM items WHERE item_id IN (
SELECT `item_id`
FROM `items_filters`
WHERE (`filter_id`='1' AND `value_id`=1)
OR (`filter_id`='2' AND `value_id`=7)
GROUP BY `item_id`
HAVING COUNT(*) = 2
) LIMIT 0,6;
Это полностью замораживает mysql, когда нет записей.
Чего я действительно не получаю, так это того, что SELECT i. * FROM items_filters itf ВНУТРЕННИЕ СОВМЕСТНЫЕ элементы i ON i.item_id = itf.item_id ГДЕ itf.filter_id = 1 AND itf.value_id = '1' LIMIT 0,1 занимает ~ 0,05, если записи не найдены, и ~ 0,008, когда есть
Объясните
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
| 1 | SIMPLE | i | ALL | PRIMARY | NULL | NULL | NULL | 10 | Using temporary; Using filesort |
| 1 | SIMPLE | itf | ref | item_id | item_id | 4 | ss_stylet.i.item_id | 1 | Using where; Using index |