WebSee

WebSee
Рейтинг
66
Регистрация
12.11.2007

Заказал прогон + составление описаний.

Все отлично, работой доволен.

Dreammaker:
IN и так медленнее простого OR работает, так ему ещё и нужно каждый раз запросы делать.

Вынес вложенный селект в отдельный запрос, вместо IN сделал OR, скоростть выполнения запроса примерно такая же как и с JOIN (первоначальный вариант запроса).

Т.е. действительно, тормоз был во вложенном селекте, учту это в дальнейшей жизни :)

В итоге время выполнения запроса осталось прежнее, но немного увеличилось время исполнения скрипта (PHP)

Dash, с командой EXPLAIN так и не разобрался, как-нибудь потом на досуге попробую узнать как с ней работать.

На счет кошек согласен :), но оригинальный запрос и таблицы намного больше приведенного примера и ни как не пересекаются с данной проблемой. Эти данные будут лишними..

Можно, конечно, сделать экспериментальную модель (прототип) приближенную к реальной, но нужно ли это, не хочется застревать на этой проблеме.

Jeck, сделал еще проще слил запрос в массив и объединил его через OR, использование временной таблицы тормозит запрос примерно в 2 раза.

Выводы: первоначальный вариант запроса хоть и получается громоздким, но показал себя наиболее быстрым пока остановлюсь на нем.

Jeck, там структура таблиц немного другая, только все усложнит.

Я наоборот здесь пытался описать как можно кратко.

В принципе решение найдено, за это большое спасибо Dash, и всем остальным за участие.


SELECT `list`.`id`, `list`.`name`
FROM `list`
WHERE `list`.`id` IN
(SELECT `list_id`
FROM `param`
WHERE `type`='day' AND `value`=$param1 OR `type`='text' AND `value`=$param2
GROUP BY `list_id` HAVING COUNT(`list_id`)=PARAM_COUNT)

где PARAM_COUNT заранее известно, в данном случае PARAM_COUNT=2

Проверил, на скорость оба варианта запросов: первый, который я написал в первом посту (модификация в 6 посту) и этот.

Результат противоположный, первый запрос выполняется в 100 раз быстрее!

Записей в таблице `list` - 27 000, в таблице `param` - 37 000

Шаманство с ключами не помогло.

Как думаете из-за чего такой результат?

Скорее всего MySQL как-то сам оптимизирует запросы и многочисленные JOIN одной и той же таблицы ни как не влияют на скорость запроса.

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

WHERE p1.`type`='day' AND p1.`value`=$param1 OR p2.`type`='text' AND p2.`value`=$param2

а нужно

WHERE p1.`type`='day' AND p1.`value`=$param1 AND p2.`type`='text' AND p2.`value`=$param2

Dash, оператор GROUP BY `list_id` понравился, кажется нужно в этом направлении двигаться, пока только не понятно как.

А выражение value IN (...) будет пересекаться с другими типами параметров, некоторые параметры равны между собой, но соответствующие ($param1, $param2,...) не обязательно.

Т.е. если в таблице `param` есть записи (1, 'day', 23), (2, 'text', 23), и нужные параметры имеют значения $param1=23, $param2='seo', то запись выберется, хотя не соответствует желанному.

Jeck:
Что то я не пойму зачем в запросе "p1.`id`=1" и "p2.`id`=2"

Каждый параметр имеет свой смысл, нужно чтоб значение соответствовало конкретному параметру, а не любому.

Наверно пример не совсем корректно представлен, немного подправил:

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.`type`='day' AND p1.`value`=$param1 AND p2.`type`='text' AND p2.`value`=$param2

Добавил к таблице `param` поле `type`, так думаю будет более понятней.

А насчет IN я тоже думал, но в данном случае это не подходит, вот если бы можно было использовать пары, что-то типа (`type`, `value`) IN (('day', $param1), ('type', $param2)), то это и было бы оптимальное решение, не знаю можно ли так?

Faster:
если условий WHERE немного (до 30-50) их можно формировать циклом

Формировать циклом имеется ввиду, через другой язык (например PHP) ?

Если так, то это понятно, нужно как-то сам MySQL-запрос оптимизировать, а то он громоздкий получается.

В твоем примере не определены p1 ...

rrr-r@yandex.ru

Спасибо.

Я думаю навигацию (меню) от контента ПС в состоянии отличить, а текст скорее всего не целиком определяется на уникальность, а сравниваются пассажи по алгоритму ШИНГЛЫ.

Я пользуюсь хостингом от McHost, поддержка здравая, остальное на сайте.

dimoz:
А кто сказал, что по запросу "детское порно" яндекс выдает именно его? На сколько я вижу, его не выдает ни один поисковик.

Не "детское порно", а "доска детское порно".

Кстати, уже на 8 месте. Раскрутился :))

Всего: 77