Как этот подзапрос дублирует результаты? Он посылает один и тот же запрос для каждой строки в результатах? - PullRequest
1 голос
/ 13 января 2012

У меня есть два отдельных запроса:

SELECT  `ad_general`.`id`
FROM (`ad_general`)
WHERE `ad_general`.`city` =  '708'
ORDER BY `ad_general`.`id` desc
LIMIT 15 

SELECT  count(`ad_general`.`id`) as count
FROM (`ad_general`)
WHERE `city` =  '708'

Я объединил эти два запроса, чтобы избежать отправки нескольких запросов в результаты MySQL для повышения производительности.

SELECT  `ad_general`.`id`, (
 SELECT  count(`ad_general`.`id`) as count
 FROM (`ad_general`)
 WHERE `city` = 708 ) AS count,
FROM (`ad_general`)
WHERE `ad_general`.`city` =  '708'
ORDER BY `ad_general`.`id` desc
LIMIT 15 

В первом подходе "столбец count имеет только одну строку и, очевидно, существует только один запрос на столбец count.

Но в комбинированном запросе столбец count имеет 15 одинаковых строк.

Мне было интересно, как mysql дублирует этот столбец "count" в этом подзапросе.Если он отправляет один и тот же запрос подсчета для каждой строки (15 раз в этом случае), в этом случае нецелесообразно использовать комбинированный запрос.

1 Ответ

1 голос
/ 13 января 2012

В первом запросе вы запрашиваете у сервера базы данных две части информации. Сначала первые 15 строк в таблице. Во-вторых, общее количество строк в таблице.

Во втором запросе вы запрашиваете шестнадцать. Вы хотите первые 15 строк таблицы и для каждой строки , вам нужно общее количество строк.

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

Преждевременная оптимизация, как правило, плохая идея. Если вы не уверены, что отправка запросов COUNT вредит вам (и, вероятно, это не так), не добавляйте сложность, чтобы «исправить» то, что, как вы знаете, не является проблемой. Если вы уверены, что вам больно, то измерьте эффективность обоих способов, чтобы увидеть, какой из них лучше. Надлежащая оптимизация производительности (почти наверняка не обязательная) заключается в сохранении денормализованного количества строк в готовом кэше.

...