MariaDB: несколько SELECT COUNT(*)

pastuhoff
На сайте с 29.10.2005
Offline
229
835

Коллеги, подскажите, можно ли на такой таблице

CREATE TABLE `z` (

`id` int(11) unsigned NOT NULL AUTO_INCREMENT,

`x` smallint(5) unsigned NOT NULL DEFAULT '0',

`a` int(11) unsigned NOT NULL DEFAULT '0',

`b` int(11) unsigned NOT NULL DEFAULT '0',

PRIMARY KEY (`id`),

KEY `x` (`x`)

) ENGINE=Aria DEFAULT CHARSET=cp1251 PAGE_CHECKSUM=1 TRANSACTIONAL=0

объединить запросы

SELECT COUNT(*) AS n1 FROM `z` WHERE x=1

SELECT COUNT(*) AS n2 FROM `z` WHERE a=0 AND x=1

SELECT COUNT(*) AS n3 FROM `z` WHERE a=1 AND x=1

SELECT COUNT(*) AS n4 FROM `z` WHERE a>1 AND x=1

SELECT COUNT(*) AS n5 FROM `z` WHERE b=0 AND x=1

SELECT COUNT(*) AS n6 FROM `z` WHERE b=1 AND x=1

SELECT COUNT(*) AS n7 FROM `z` WHERE b>1 AND x=1

в один, дабы уменьшить общее время выполнения всех этих селектов (новые индексы создавать нельзя).

Коллекционер доменных имен.
ДП
На сайте с 23.11.2009
Offline
203
#1

Заменить COUNT(*) на SUM(IF(x=1,1,0)) as n1, SUM(IF(x=1 AND a=0,1,0))as n2 и аналогично для остальных условий и в WHERE оставить только x=1

Но вот не факт, что быстрее получится - попробуйте.

pastuhoff
На сайте с 29.10.2005
Offline
229
#2

Дикий пионер, благодарю! Получилось именно то, что и хотелось: один проход, время на выполнение запроса в ~7 раз меньше. Ну только в Вашем примере не нужны условия вида "x=1 AND", раз есть "WHERE x=1"

ДП
На сайте с 23.11.2009
Offline
203
#3
pastuhoff:
Дикий пионер, благодарю! Получилось именно то, что и хотелось: один проход, время на выполнение запроса в ~7 раз меньше. Ну только в Вашем примере не нужны условия вида "x=1 AND", раз есть "WHERE x=1"

Да, сорри, внимательно запросы не рассматривал, просто общий принцип решил показать.

pastuhoff
На сайте с 29.10.2005
Offline
229
#4

В итоге, решение такое:

SELECT

SUM(1) AS `n1`,

SUM(IF(a=0,1,0)) AS `n2`,

SUM(IF(a=1,1,0)) AS `n3`,

SUM(IF(a>1,1,0)) AS `n4`,

SUM(IF(b=0,1,0)) AS `n5`,

SUM(IF(b=1,1,0)) AS `n6`,

SUM(IF(b>1,1,0)) AS `n7`

FROM `z` WHERE x=1

Эксплейн и реальные замеры времени на рабочей базе говорят, что имеем ускорение в ~7 раз. Еще раз благодарю!

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий