每天存储数百万条记录数据的最佳方法,这些数据可以为统计目的进行分组?

时间:2016-12-28 15:16:43

标签: php mysql node.js database-design ip-geolocation

我正在为营销广告系列开发自定义跟踪工具。此工具位于广告和着陆页之间。它负责保存用户的所有数据,例如用户代理中的信息,IP,登录页面上的点击以及用户IP(国家,ISP等)的地理编码数据。

目前我遇到了一些设计问题:

  • 这些广告系列的流量非常高,因此我每天可能会插入数百万行。这个系统可以有多个用户,因此我无法将所有这些数据存储在一个表中,因为它会变得一团糟。也许我可以在更多的表中拆分数据,每个用户一个表,但我不确定这个解决方案。
  • 数据保存过程必须尽快完成(几毫秒),所以我认为NodeJS要比PHP好得多。特别是在速度和服务器资源方面。我不希望服务器因内存不足而崩溃。
  • 我需要将这些数据分组以用于统计目的。例如,对于访问我的目标网页的每个用户,我都有一行,但我需要对这些数据进行分组,以显示此特定目标网页上的展示次数。因此,所有这些查询都需要使用这么多行来尽可能快地执行。
  • 我需要对IP地址进行地理编码,因此我需要准确的信息,如国家/地区,ISP,连接类型等,但如果我调用API服务,这可能会减慢数据保存过程。这必须是实时完成的,不能在以后完成。

保存过程结束后,系统应重定向到目标网页。时间对于不失去任何可能的领先是非常重要的。

基本上,我找到了最佳解决方案:

  • 有效管理非常大的数据库
  • 尽可能在最短的时间内保存用户数据(ms)
  • 如果可能,请在尽可能短的时间内将地理编码设为ip,而不会阻止执行
  • 优化架构和用于生成统计信息的查询

你有什么建议吗?提前谢谢。

1 个答案:

答案 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
  • 规范化重复的字符串。

较小的数据会使其更易于缓存,因此当您必须点击磁盘时运行速度更快。