Задавайте вопросы, мы ответим
Вы не зашли.
mihim написал:
paulus, в EXPLAIN все красиво, но хоть убейте меня, скорость работы варианта с подзапросом выше в 3 раза. На 130 000 записей в vacancies и 25 городах - 0,07 против 0,19 сек В теории с подзапросом должно работать медленнее, но на практике всё иначе...
я в это верю :-) больше того, это вполне объяснимо.
в данном случае, подзапрос исполняется один раз, отсюда и выигрыш по времени исполнения. Оптимизатор считает подзапрос константным(его результаты не зависят от данных из внешнего запроса) и выполняет его один раз, а потом уже исполняет join.
Как раз Ваш, paulus, последний запрос, считает count на каждую выбранную строку из towns и explain к сожалению этого не покажет. красивый explain - не залог оптимальной работы. :-)
Неактивен
Вот и ладненько Буду пользоваться вариантом с подзапросом.
paulus, avgsoft еще раз спасибо за помощь!
Неактивен
Хм, avgsoft, объясните тогда, пожалуйста, чем отличается способ
«посчитать count(*) каждый раз для одного элемента по ключу» (без подзапроса)
от «посчитать count(*) один раз для всех элементов» (с подзапросом)?
Неактивен
работы меньше исполняется. что то вроде "оптом дешевле" :-)
Неактивен
«посчитать count(*) каждый раз для одного элемента по ключу» - позиционируемся по ключу на нужный узел, считаем.
«посчитать count(*) один раз для всех элементов» - читаем данные из индекса, для каждого узла считаем.
нужна вся таблица, то есть при любом варианте, нужны все данные, хранящиеся в индексе. в вариант "count(*) один раз" работы исполняется меньше.
согласен, подзапрос тоже обладает рядом недостатков, но я пытался объяснить почему в данном случае подзапрос работает лучше.
Неактивен
Я не понимаю, почему подзапрос работает лучше, правда. Спуск по индексу —
мгновенная операция. Учитывая, что в целевой таблице городов всего 25 —
это не влияет на производительность.
Неактивен
ну не настолько мгновенная.
да и ещё один вариант: count(имя_поля) считает количество не-NULL значений в указанной колонке, в отличие от count(*) . это тоже может давать отставание по времени исполнения.
Неактивен
Ну что значит не мгновенная? Если я могу взять, например, 20к строк/с по индексу,
это означает, что задержка не более 1/20k секунды. Мой калькулятор говорит, что
даже если городов 100, это вносит доп. время 0.005 секунды.
Может, я просто зажрался на быстрых процессорах?
Неактивен