Несколько SELECT COUNT в одном запросе MySQL
В данной небольшой статье речь пойдет о базах данных в частности MySQL, выборке и подсчете. Работая с базами данных, часто требуется совершить подсчет количества строк COUNT() с определенным условием или без, это сделать крайне просто следующим запросом
Запрос вернет значение, с количеством строк в таблице.
Подсчет с условием
Запрос вернет значение, с количеством строк в таблице удовлетворяющих данному условию: var = 1
Для получения нескольких значений подсчета строк с разными условиями, можно поочередно выполнить несколько запросов, например
SELECT count(*) FROM table WHERE var = 1; SELECT count(*) FROM table WHERE var = 2; SELECT count(*) FROM table WHERE var = 3; |
Но в ряде случаев, такой подход не практичен и не оптимален. По этому актуальным становится организация запроса, с несколькими подзапросами, для получения в одном запросе сразу несколько результатов. Например
SELECT count(*) AS c1, (SELECT count(*) FROM table WHERE var = 2) AS c2, (SELECT count(*) FROM table WHERE var = 3) AS c3 FROM table WHERE var = 1; |
Таким образом выполнив всего один запрос к базе данных, мы получаем результат с подсчетом количества строк по нескольким условиям, содержащий несколько значений подсчета, например
c1|c2|c3 -------- 1 |5 |8 |
Недостатком использования подзапросов, в сравнении с несколькими отдельными запросами, можно считать скорость выполнения и нагрузку на базу данных.
Следующий пример запроса, содержащего несколько COUNT в одном запросе MySQL, построен несколько иначе, в нем используются конструкции IF(условие, значение1, значение2), а также суммирование SUM(). Позволяющие произвести отбор данных по заданным критериям в рамках одного запроса, затем суммировать их, и вывести несколько значений в качестве результата.
SELECT SUM(1) tatal, SUM( IF(var = 1,1,0) ) c1, SUM( IF(var = 2,1,0) ) c2, SUM( IF(var = 3,1,0) ) c3 FROM table |
Как видно из запроса, он построен достаточно лаконично, но скорость его выполнения тоже не порадовала, результат данного запроса будет следующий,
total|c1|c2|c3 -------------- 14 |1 |5 |8 |
Далее я приведу сравнительную статистику скорости выполнения трех вариантов запросов, для выборки нескольких COUNT(). Для тестирования скорости выполнения запросов, было выполнено по 1000 запросов каждого типа, с таблицей содержащей более трех тысяч записей. При этом каждый раз запрос содержал SQL_NO_CACHE для отключение кеширования результатов базой данных.
Скорость выполнения
Три отдельных запроса: 0.9 сек
Один запрос с подзапросами: 0.95 сек
Один запрос с конструкцией IF и SUM: 1.5 сек
Вывод. И так, мы имеет несколько вариантов построения запросов к базе данных MySQL с несколькими COUNT(), первый вариант с отдельными запросами не очень удобен, но имеет наилучший результат по скорости. Второй вариант с подзапросами несколько удобнее, но при этом скорость его выполнение немного ниже. И наконец третий лаконичный вариант запроса с конструкциями IF и SUM, кажущийся самым удобным, имеет самую низкую скорость выполнения, которая почти в два раза ниже первых двух вариантов. По этому, при задаче оптимизации работы БД, я рекомендую использовать второй вариант запроса содержащий подзапросы с COUNT(), во первых его скорость выполнения близка к самому быстрому результату, во вторых такая организация внутри одного запроса достаточно удобна.

Автор:






