Я занимаюсь разработкой веб-приложения с использованием Yii2 Framework и базы данных, использующей MySQL
, в системе одно из требований включает в себя функцию журнала приложения, которая фиксирует весь журнал, сделанный в приложении, и необходимость фильтрации по обработкедень
журнал содержит период даты, который состоит из 2 столбцов
log_startdate и log_enddate
представление sql было создано для захвата интервала времени между этими двумя датами (интервал времени минус праздничные и выходные дни)
мы называем это first_view_sql
для второго представления, которое я создал для группировки по интервалу времени по определенному kpi_stage
KPI означает производительность ключаИндикатор
во время второго просмотра системы всегда дает сбой из-за слишком большой загрузки данных, и модель yii2, которая используется для загрузки настольной системы на тексах навсегда, чтобы загрузить
, я пробовал использовать ниже секундыпосмотреть sql
SELECT
log_id,
application_id,
kpi_stage,
SUM(diff_day) AS sum_diff_day,
SUM(diff_day) + FLOOR((SUM(diff_minute)+ROUND(FLOOR((SUM(diff_second)/60)),0))/60) AS mod_sum_diff_day,
-- SUM(diff_hour) AS sum_diff_hour,
MOD(SUM(diff_hour) + FLOOR((SUM(diff_minute)+ROUND(FLOOR((SUM(diff_second)/60)),0))/60),24) as mod_sum_diff_hour,
-- SUM(diff_minute)+ROUND(FLOOR((SUM(diff_second)/60)),0) AS sum_diff_minute,
MOD(SUM(diff_minute)+ROUND(FLOOR((SUM(diff_second)/60)),0),60) AS mod_sum_diff_minute,
-- SUM(diff_second) AS sum_diff_second,
MOD(SUM(diff_second),60) AS mod_sum_diff_second
FROM
processing_day
WHERE log_type_id = 1
AND application_id = 1
GROUP BY(kpi_stage)
и он работает быстро и точно, но где "И приложениеon_id = 1 "нельзя использовать, потому что second_view_sql должен загружать все приложения, чтобы иметь возможность фильтровать по дням обработки в режиме реального времени
application_log - таблица, в которой хранятся все данные, ниже - DDL
CREATE TABLE `application_log` (
`log_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`application_id` int(11) unsigned DEFAULT NULL,
`application_status_id` int(11) unsigned DEFAULT NULL,
`user_id` int(11) DEFAULT NULL,
`log_startdate` datetime DEFAULT '1000-01-01 00:00:00',
`log_enddate` datetime DEFAULT '1000-01-01 00:00:00',
`log_type_id` tinyint(4) unsigned DEFAULT 1,
PRIMARY KEY (`log_id`),
KEY `log_id` (`log_id`),
KEY `application_id` (`application_id`),
KEY `application_status_id` (`application_status_id`),
KEY `user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
first_view_sql это
SELECT
application_log.log_id,
application_log.application_id,
application_log.log_startdate,
application_log.log_enddate as log_enddate_original,
application_log.application_status_id,
(CASE
WHEN application_status_id IN(2,3,17) THEN 1
WHEN application_status_id IN(16,19,20,21,27,28,29,26,31,4,5,6,7,10,9,8) THEN 2
WHEN application_status_id IN(22,23,24,11,12,18) THEN 3
WHEN application_status_id IN(25,13,14) THEN 4
ELSE 0
END) AS kpi_stage,
IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate) as log_enddate_fix,
application_log.log_type_id,
(SELECT COUNT(*) FROM event_date WHERE (event_date.a_day BETWEEN log_startdate AND IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate)) AND DAYNAME(event_date.a_day) NOT IN ('Saturday','Sunday') ) as holiday,
(SELECT COUNT(*) FROM calendar WHERE (calendar.a_day BETWEEN log_startdate AND IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate)) AND (DAYNAME(calendar.a_day) IN ('Saturday','Sunday') ) ) as diff_weekend,
GREATEST(FLOOR(TIMESTAMPDIFF(HOUR,log_startdate,IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate)) / 24),0) as diff_day_original,
GREATEST((FLOOR(TIMESTAMPDIFF(HOUR,log_startdate,IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate)) / 24) - (SELECT COUNT(*) FROM calendar WHERE (calendar.a_day BETWEEN log_startdate AND IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate)) AND (DAYNAME(calendar.a_day) IN ('Saturday','Sunday') ) ) ),0) as diff_day,
GREATEST(MOD(TIMESTAMPDIFF(HOUR,log_startdate,IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate)), 24),0) as diff_hour,
GREATEST(MOD(TIMESTAMPDIFF(MINUTE,log_startdate,IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate)), 60),0) as diff_minute,
GREATEST(MOD(TIMESTAMPDIFF(SECOND,log_startdate,IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate)), 60),0) as diff_second,
-- date_f = diff_day - diff_weekend - holiday
CONCAT(
GREATEST((FLOOR(TIMESTAMPDIFF(HOUR,log_startdate,IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate)) / 24) - (SELECT COUNT(*) FROM calendar WHERE (calendar.a_day BETWEEN log_startdate AND IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate)) AND (DAYNAME(calendar.a_day) IN ('Saturday','Sunday') ) ) ),0), ' days ',
GREATEST(MOD(TIMESTAMPDIFF(HOUR,log_startdate,IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate)), 24),0), ' hours ',
GREATEST(MOD(TIMESTAMPDIFF(MINUTE,log_startdate,IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate)), 60),0), ' minutes ',
GREATEST(MOD(TIMESTAMPDIFF(SECOND,log_startdate,IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate)), 60),0),' seconds ') as date_f,
CONCAT(
GREATEST((FLOOR(TIMESTAMPDIFF(HOUR,log_startdate,IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate)) / 24) - (SELECT COUNT(*) FROM calendar WHERE (calendar.a_day BETWEEN log_startdate AND IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate)) AND (DAYNAME(calendar.a_day) IN ('Saturday','Sunday') ) ) ),0), ':',
GREATEST(MOD(TIMESTAMPDIFF(HOUR,log_startdate,IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate)), 24),0), ':',
GREATEST(MOD(TIMESTAMPDIFF(MINUTE,log_startdate,IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate)), 60),0), ':',
GREATEST(MOD(TIMESTAMPDIFF(SECOND,log_startdate,IF(log_enddate = '1000-01-01 00:00:00', NOW(), log_enddate)), 60),0)) as diff_formated
FROM
application_log
второй вид sql
SELECT
log_id,
application_id,
kpi_stage,
SUM(diff_day) AS sum_diff_day,
SUM(diff_day) + FLOOR((SUM(diff_minute)+ROUND(FLOOR((SUM(diff_second)/60)),0))/60) AS mod_sum_diff_day,
-- SUM(diff_hour) AS sum_diff_hour,
MOD(SUM(diff_hour) + FLOOR((SUM(diff_minute)+ROUND(FLOOR((SUM(diff_second)/60)),0))/60),24) as mod_sum_diff_hour,
-- SUM(diff_minute)+ROUND(FLOOR((SUM(diff_second)/60)),0) AS sum_diff_minute,
MOD(SUM(diff_minute)+ROUND(FLOOR((SUM(diff_second)/60)),0),60) AS mod_sum_diff_minute,
-- SUM(diff_second) AS sum_diff_second,
MOD(SUM(diff_second),60) AS mod_sum_diff_second
FROM
processing_day
WHERE log_type_id = 1
GROUP BY(kpi_stage)