V
Size: a a a
А
...- в конце TRUNCATE вместо COMMIT'а, он закоммитит данные и очистит временную таблицу, а если до него дело не дошло, то временная таблица не очистится и данные попробуют загрузиться повторно
START TRANSACTION;
INSERT INTO trackdb.tracking_data (created_at, event_type, conf_id, conf_shown, is_first, page_sid, conversion_value)
SELECT t.created_at, t.event_type, t.conf_id, t.conf_shown, t.is_first, t.page_sid, t.conversion_value
FROM tmp_tracking_data t
INNER JOIN confs g ON t.conf_id = g.id
;
SET @id_beg := IF(ROW_COUNT() > 0, LAST_INSERT_ID(), NULL)
, @id_end := IF(ROW_COUNT() > 0, LAST_INSERT_ID() + ROW_COUNT() - 1, NULL)
;
-- make day agregation
INSERT INTO tracking_data_agregated
(conf_id, date, server_id, conf_shown, imp_cnt, conv_cnt, vtc_cnt, conversion_value)
SELECT *
FROM (
SELECT t.conf_id new_conf_id
, DATE(t.created_at) new_date
, @@server_id new_server_id
, t.conf_shown new_conf_shown
, COUNT(CASE WHEN t.event_type = 'impression' THEN 1 END) new_imp_cnt
, COUNT(CASE WHEN t.event_type = 'conversion' THEN 1 END) new_conv_cnt
, COUNT(CASE WHEN t.event_type = 'vtc' THEN 1 END) new_vtc_cnt
, SUM(t.conversion_value) new_conversion_value
FROM trackdb.tracking_data t
WHERE t.id BETWEEN @id_beg AND @id_end
AND t.event_type IN ('impression', 'conversion', 'vtc')
GROUP BY t.conf_id, DATE(t.created_at), t.conf_shown
ORDER BY new_conf_id, new_date, new_conf_shown
) t
ON DUPLICATE KEY UPDATE imp_cnt = IFNULL(imp_cnt, 0) + IFNULL(t.new_imp_cnt, 0)
, conv_cnt = IFNULL(conv_cnt, 0) + IFNULL(t.new_conv_cnt, 0)
, vtc_cnt = IFNULL(vtc_cnt, 0) + IFNULL(t.new_vtc_cnt, 0)
, conversion_value = IFNULL(conversion_value, 0) + IFNULL(t.new_conversion_value, 0)
;
...
TRUNCATE TABLE tmp_tracking_data
;
CREATE TABLE `trackdb`.`tracking_data` (- вот что ИННОДБ СТАТУС говорит:
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`created_at` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
`event_type` enum('impression','conversion','vtc','abandon','restart') NOT NULL,
`conf_id` int unsigned DEFAULT NULL,
`conf_shown` tinyint(1) DEFAULT NULL,
`is_first` tinyint(1) DEFAULT NULL,
`page_sid` char(32) DEFAULT NULL,
`conversion_value` float DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `tracking_data_created_at_index` (`created_at`)
) ENGINE=InnoDB
;
CREATE TABLE `tracking_data_agregated` (
`conf_id` int unsigned NOT NULL,
`date` date NOT NULL,
`server_id` int unsigned NOT NULL,
`conf_shown` tinyint(1) NOT NULL DEFAULT '1',
`imp_cnt` int DEFAULT NULL,
`conv_cnt` int DEFAULT NULL,
`vtc_cnt` int DEFAULT NULL,
`conversion_value` float DEFAULT NULL,
PRIMARY KEY (`conf_id`,`date`,`server_id`,`conf_shown`)
) ENGINE=InnoDB
;
А
trackdb
.tracking_data
trx id 1176808 lock_mode X locks rec but not gaptrackdb
.tracking_data
trx id 1176808 lock mode S waitingtrackdb
.tracking_data
trx id 1176807 lock_mode X locks rec but not gaptrackdb
.tracking_data
trx id 1176807 lock mode S waitingА
k
k
А
А
А