Несколько COUNT(*) в одном часто выполняемом запросе - MySQL

Формулировка задачи:

Приветствую! Существует такая проблема: есть таблица с ~30000 записей. В ней надо каждые несколько секунд считать количества записей с определенным набором параметров, состоящим из 2х столбцов: state и user. Притом вариантов state - 15, user - 20, а считаются только сегодняшние, максимум - позавчерашние, записи. В течение минуты обновляется информация примерно в 10 строках и добавляется около 5. Сейчас это делается запросом с 15 вложенными SELECT COUNT(*), который выполняется ~0,2 секунды. Собственно вопрос: как это можно оптимизировать?


textual

Код к задаче: «Несколько COUNT(*) в одном часто выполняемом запросе - MySQL»

SELECT ( SELECT COUNT(*) FROM `requests` WHERE (`date` = CURDATE() or `date` = '2017-09-12') and `del` <> 'hide' and ((`userID` = '' and (`state` = 'neobr' ) and  `state` <> 'brak') or (`userID` <> '' and `checkMoscow` = 'region' and state = 'neobr'))) as `allNeobr`,
(SELECT COUNT(*) FROM `requests` WHERE `state` = 'prihod' and `del` = '' and `rdate` = CURDATE()  and `requests`.`userID` = "" ) as `allPrihod`, 
(SELECT COUNT(*) FROM `requests` WHERE `state` IN('zapis', 'podtverjden') and `del` = '' and `rdate` = CURDATE()  and `requests`.`userID` = "" ) as `allZapis`,
(SELECT COUNT(*) FROM `requests` WHERE `state` = 'sliv' and `rdate` = CURDATE() and `del` = ''  and `requests`.`userID` = "" ) as `allSliv`,
(SELECT COUNT(*) FROM `balance_minus` WHERE `date` = CURDATE() and `money` = '400') as `allPartner`,
(SELECT COUNT(`requests`.`id`) FROM  `requests` INNER JOIN `crm_users_night` ON `requests`.`userID` =  `crm_users_night`.`ID` WHERE `crm_users_night`.`gorod`<>'Москва МО') as `allPartnerReg`,
(SELECT COUNT(*) FROM `requests` WHERE `state` = 'sozvon' and `rdate` = CURDATE() and `del` = ''  and `requests`.`userID` = "" ) as `allSozvon`,
(SELECT COUNT(*) FROM `requests` WHERE `state` = 'brak' and `date` = CURDATE() and `del` = ''  and `requests`.`userID` = "" ) as `allBrak`,
(SELECT COUNT(*) FROM `requests` WHERE `state` = 'nedozvon' and `date` = CURDATE() and `del` = ''  and `requests`.`userID` = "" ) as `allNedozvon`,
(SELECT COUNT(*) FROM `requests` WHERE `state` = 'bk' and `date` = CURDATE() and `del` = ''  and `requests`.`userID` = "" ) as `allBk`,
(SELECT COUNT(*) FROM `requests` WHERE `state` = 'vtorich' and `date` = CURDATE() and `del` = ''  and `requests`.`userID` = "" ) as `allVtorich`,
(SELECT COUNT(*) FROM `requests` WHERE `date` = CURDATE()    and `del` = '') as `allCount`
Эта работа вам не подошла?

Вы всегда можете заказать любую учебную работу у наших авторов от 20 руб.


СДЕЛАЙТЕ РЕПОСТ

5   голосов, оценка 4.000 из 5

Источник