SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 03.02.2008 08:41:23

WebSee
Участник
Зарегистрирован: 03.02.2008
Сообщений: 4

Вопрос к специалистам

Приветствую, уважаемые специалисты!

Столкнулся с одной задачкой на оптимизацию, объясню вкратце:
есть две таблицы:
`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 yikes

Вот и хочется узнать мнение экспертов возможно ли оптимизировать такой запрос для большого числа параметров?

Неактивен

 

#2 03.02.2008 10:49:39

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Вопрос к специалистам

Многократные 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)

Неактивен

 

#3 03.02.2008 11:58:10

WebSee
Участник
Зарегистрирован: 03.02.2008
Сообщений: 4

Re: Вопрос к специалистам

Но в данном случае будут выбраны записи, где совпадает хотябы один из параметров, а нужно чтоб все значения параметров совпадали.
Нужно чтоб везде был оператор AND, пока более оптимального решения не удалось найти.

На счет индексов спасибо.

Неактивен

 

#4 03.02.2008 12:05:27

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Вопрос к специалистам

Да, Вы правы. В таком случае, если запросы будут слишком медленными, поможет только денормализация таблицы параметров (list_id, param1,param2, param3, ...., paramN);

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson