我正在为营销广告系列开发自定义跟踪工具。此工具位于广告和着陆页之间。它负责保存用户的所有数据,例如用户代理中的信息,IP,登录页面上的点击以及用户IP(国家,ISP等)的地理编码数据。
目前我遇到了一些设计问题:
保存过程结束后,系统应重定向到目标网页。时间对于不失去任何可能的领先是非常重要的。
基本上,我找到了最佳解决方案:
你有什么建议吗?提前谢谢。
答案 0 :(得分:0)
每个用户一张桌子更糟糕;不要这样做。
每天数百万行 - 每秒数十,甚至数百?这可能需要某种形式的“分期”。 - 收集多行,然后批量插入它们。在进一步讨论之前,请详细说明数据流:单个客户端与多个客户端。 UI与批处理过程。暂定CREATE TABLE
。等
统计 - 计划创建和增量维护"汇总表"。
您是否尝试将用户IP地址映射到国家/地区?这是一个单独的问题,已得到回答。
"必须" "实时" "毫秒&#34 ;.面对它,你将不得不做出一些权衡。
更多信息:转到http://mysql.rjweb.org/;从那里,请参阅有关数据仓库技术的三个博客。
如何按天存储
InnoDB以PRIMARY KEY
顺序存储数据。因此,要使所有行在一天内彼此相邻,必须使用日期时间启动 PK。对于大型数据库,可以通过允许查询按顺序扫描数据来显着改进某些查询,从而最大限度地减少磁盘I / O.
如果您已经id AUTO_INCREMENT
(如果您仍然需要它),请执行以下操作:
PRIMARY KEY(datetime, id), -- to get clustering, and be UNIQUE
INDEX(id) -- to keep AUTO_INCREMENT happy
如果你有一年的数据,并且数据不适合RAM,那么这种技术对于小时间范围非常有效。但是如果你的时间范围大于缓存,你将受到I / O速度的支配。
维护包含更改数据的摘要表
此可能可能;我需要更好地了解数据和变化。
无论缓存,调优和其他优化如何, 无法在亚秒内扫描一百万行。您可以使用Summary表更快地执行所需的数据。缩小数据
BIGINT
(4个字节)就足够了,请不要使用INT
(8个字节);如果INT
(3个字节)可以,请不要使用MEDIUMINT
。等UNSIGNED
。较小的数据会使其更易于缓存,因此当您必须点击磁盘时运行速度更快。