Задавайте вопросы, мы ответим
Вы не зашли.
Приветствую, уважаемые специалисты!
Столкнулся с одной задачкой на оптимизацию, объясню вкратце:
есть две таблицы:
`list` с полями `id`, `name`
`param` с полями `id`, `list_id`, `value`
Здесь идет связь один ко многим (`list`.`id`=`param`.`list_id`)
В таблице `param` хранятся параметры записей из таблицы `list`
Так же имеются значения нужных параметров: $param1=23, $param2='seo' и т.п.
Собственно теперь задача:
Выбрать из таблицы `list` только те записи, для которых значения параметров из таблицы `param` соответствуют заданным параметрам: $param1, $param2 и т.п.
Мое решение:
SELECT `list`.`id`, `list`.`name` FROM `list` LEFT JOIN `param` AS p1 ON (p1.`list_id`=`list`.`id`) LEFT JOIN `param` AS p2 ON (p2.`list_id`=`list`.`id`) WHERE p1.`id`=1 AND p1.`value`=$param1 AND p2.`id`=2 AND p2.`value`=$param2
Т.е. для каждого значения параметра делаем свою выборку из одной и той же таблицы параметров.
В примере всего два параметра, а представляете что будет, если параметров, хотя бы 15
Вот и хочется узнать мнение экспертов возможно ли оптимизировать такой запрос для большого числа параметров?
Неактивен
Многократные JOIN делать не следует.
Можно заменить на один JOIN и условие OR
SELECT `list`.`id`, `list`.`name` FROM `list` LEFT JOIN `param` AS p1 ON (p1.`list_id`=`list`.`id`) WHERE (p1.`id`=1 AND p1.`value`=$param1) OR (p1.`id`=2 AND p1.`value`=$param2);
Не забывайте про использование составных индексов, например KEY(list_id, id, value)
Неактивен
Но в данном случае будут выбраны записи, где совпадает хотябы один из параметров, а нужно чтоб все значения параметров совпадали.
Нужно чтоб везде был оператор AND, пока более оптимального решения не удалось найти.
На счет индексов спасибо.
Неактивен
Да, Вы правы. В таком случае, если запросы будут слишком медленными, поможет только денормализация таблицы параметров (list_id, param1,param2, param3, ...., paramN);
Неактивен