1

所以......假设我有一个包含三个表的数据库:
客户端
数据
和表clients_to_data

而且我有一个 API,它允许客户端访问来自 Table data的数据。每个客户端在 Table clients中都有一条记录(例如 IP 地址等)。为了记录谁访问了什么,我正在记录表clients_to_data(其中包含表客户端的 ID 、表数据和时间戳。)
每次用户访问我的 API,他登录到clients_to_data表。(所以客户端数据中的记录不会更新,只是读取。)
我还希望能够获得每个客户端的点击量。很简单,只需查询clients_to_data带有 client_id 的表并计算结果。但是随着我的数据库的增长,我将在clients_to_data表中拥有数万条记录。这是我的问题:将字段“命中”添加到存储该用户的命中数量并在每次用户查询 API 时递增的表客户端
是否是一种更好的做法 所以这将添加到我的数据库中听说一般是坏事。但在这种情况下,我认为它会加快检索点击量的过程。 那么在这种情况下哪种方法更好更快呢?谢谢你的帮助!
redundancy

4

3 回答 3

2

显然,从表中选择单个整数列会比从表中选择 count() 行更快。

复杂性的权衡有点没有意义。一种方式是您需要编写更复杂的 sql,另一种方式是您需要在代码中更新/插入 2 个表。

多久查询一次命中数?您的客户会查看它,还是您每月检查一次?如果你只是偶尔看一下,我可能不会太在意选择 count(*) 所花费的时间。

如果您的客户查看每个请求的命中数,那么我会考虑存储命中列。

于 2012-05-14T21:27:43.710 回答
2

什么时候更快?追加到表会比查找记录和更新记录更快,比读取记录、递增和更新记录要快得多。

然而,“预先计算”的命中将比聚合查询更快地计算它们。

您在回旋处失去的挥杆中获得了什么,您做出的选择取决于您当前的使用模式。那么,您准备好放慢添加命中的速度,以显着提高您的命中数吗?

于 2012-05-14T21:33:43.807 回答
1

现在我们的表结构都已经明确定义了,让我们开始工作吧。

您想在数据库中记录一些内容,即每个客户端访问数据的次数,换句话说,

为每个客户“印象”插入一条记录到表“client_to_data”中。

你担心两件事,

1. 冗余
2. 检索计数时的性能

存储计数时的性能如何。(插入语句)..?

这是一个经典场景,我会将要插入的数据写入 memcache,并在一天结束时进行批量插入。

更重要的是,我会在将数据插入数据库之前对其进行规范化。至于选择,创建索引。如果是文本,请安装 sphinx。

谢谢。

于 2012-05-14T21:32:10.210 回答