MySQL表保存统计数据的最佳结构

时间:2016-08-31 13:24:11

标签: mysql performance web-applications statistics scalability

我需要一种解决方案,允许我跟踪Web应用程序(PHP5 / MySQL5.7)中的每次单击(以及链接的链接和日期)。最简单的解决方案显然是一个简单的表:

CREATE TABLE stats_data (
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    log_date DATETIME NOT NULL DEFAULT NOW(),
    link VARCHAR(512) NOT NULL
)

我并不是这样的表现如何扩展性能,因为预期的点击量每天可能超过10000

  1. 这是一个可靠的解决方案,比如,在存储了5个月的数据之后?
  2. 哪些优化措施可以使此解决方案表现更好
  3. 如果没有,对此更好的解决方案是什么?

3 个答案:

答案 0 :(得分:1)

主要取决于您的用例。您希望在此数据集上运行哪些查询?

我肯定会推荐一些面向文档的数据库(如Redis或MongoDb),但正如我所说,这取决于你将如何使用你的数据。

如果您想坚持使用MySQL,我就如何使该解决方案更可靠提出一些建议。

  1. 每次点击都不要将每次点击保存到数据库中,而是将其存储到缓存中(例如memcached),每小时一次保存到MySQL中
  2. 每月制作一张桌子,不在一张大桌子上进行搜索。并且每月备份该表。

答案 1 :(得分:1)

我猜你可以将链接放在一个单独的表中,并将你的表引用作为外键。应尽可能加快速度,例如检查特定链接的点击次数。

根据您对数据的准确程度,您还可以将其聚合到maby中的另一个表中,进行某种类型的夜间运行操作(计划的sp应该起作用)。 通过这种方式,您可以拥有一个表格,例如您可以查看在特定时间间隔,一天或一小时内点击链接的次数,或满足您需求的任何内容。我已经在工作中使用了这种方法,我们在负载非常繁重的应用程序中存储Web服务调用的统计数据,并且它一直工作正常,没有任何性能问题。

答案 2 :(得分:0)

有几个人认为你可以做些以确保表现:

通过按日期列分割数据,您可以按小时/天/周/月/年“分离”数据......无论您想要什么......

示例:

CREATE TABLE members (
firstname VARCHAR(25) NOT NULL,
lastname VARCHAR(25) NOT NULL,
username VARCHAR(16) NOT NULL,
email VARCHAR(35),
joined DATE NOT NULL
)
PARTITION BY RANGE( YEAR(joined) ) (
  PARTITION p0 VALUES LESS THAN (1960),
  PARTITION p1 VALUES LESS THAN (1970),
  PARTITION p2 VALUES LESS THAN (1980),
  PARTITION p3 VALUES LESS THAN (1990),
  PARTITION p4 VALUES LESS THAN MAXVALUE
)

因此,想象您按周分类数据,当您使用日期等于'2016-08-25'的日志进行搜索时,该记录将仅搜索日期介于'2016-08-22'之间的日志'2016年8月28日'。

我希望这可以帮到你。