需求
已知访问用户经纬度数据,根据经纬度统计每个省的访问总数
地区经纬度分布表
CREATE TABLE `area_geo` (
`id` int(11) NOT NULL,
`name` varchar(250) NOT NULL COMMENT '地区名',
`ext_name` varchar(255) NOT NULL COMMENT '地区扩展名',
`geo` geometry NOT NULL COMMENT '地区核心经纬度',
`polygon` geometry NOT NULL COMMENT '地区经纬度范围',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
地区经纬度初始化数据
见文档顶端附件资源
定时任务&存储过程统计
基于地图数据统计的性能问题,考虑通过MySQL定时任务单独将地图数据进行统计结果保存,然后通过DBT脚本关联输出到数据仓库,创建访问数据存储表、存储过程、和定时任务
--开启定时器(或者通过MySQL配置永久性开启)
set global event_scheduler=1;
--查看开启情况,是否为ON
show variables like '%event_sche%';
--存储过程创建
DROP PROCEDURE IF EXISTS `area_geo_visit_data_pro`;
delimiter ==
CREATE PROCEDURE `area_geo_visit_data_pro`()
BEGIN
DELETE FROM area_geo_visit_data;
INSERT into area_geo_visit_data(event_time,module,label,cnt)
SELECT
CURDATE() as event_time,
'VISIT_MAP' as module,
c.name as label,
SUM(b.cnt) as cnt
FROM
(
SELECT
a.location_longitude,
a.location_latitude,
COUNT(1) as cnt
FROM
matomo.matomo_log_visit a
group by
a.location_longitude,
a.location_latitude
)b ,
matomo.area_geo c
WHERE
st_intersects(ST_GeomFromWKB(c.polygon),
(st_geometryfromtext(concat('POINT(', CAST(b.location_longitude AS char) , ' ', CAST(b.location_latitude AS char) , ')'),0)))
GROUP BY
c.name ;
END
==
delimiter ;
--定时任务创建(统计频率可以根据需要设置,目前是与dbt脚本执行频率保持一致)
CREATE EVENT IF NOT EXISTS area_geo_visit_data_event
ON SCHEDULE EVERY 24 HOUR
ON COMPLETION PRESERVE
DO
CALL area_geo_visit_data_pro();