2012-05-14 32 views
1

所以......假设我有三个表的数据库:
客户
数据
和表clients_to_data
MySQL性能 - “冗余” 对速度/系统性能

我有一个API允许客户访问表数据中的数据。每个客户都有一个记录表客户(带之类的IP地址等)。为了记录谁访问了什么,我在表中记录我clients_to_data(其中包含ID为表客户,表数据以及时间戳。)
每次用户访问我的API时,他都会登录clients_to_data表。 (所以记录在客户端数据没有更新,只是读。)
我也希望能够获得每客户端的点击量。很简单,只需查询带有client_id的clients_to_data表并对结果进行计数。但随着我的数据库增长,我将在clients_to_data表中有十万条记录。 这是我的问题:
它是一个更好的做法,现场的“点击”添加到表客户存储点击量为该用户和每一个用户查询API
时间增加呢?所以,这将是添加redundancy到我听到的数据库通常是一件坏事。但在这种情况下,我认为它会加快检索点击量的过程。
那么哪种方法在这种情况下更好更快呢?谢谢你的帮助!

回答

2

更快的时候? 追加到表格会比找到记录并更新记录更快,比读取记录要快得多,增加并更新它。

但是,如果命中“预先计算”,将比聚合查询更快地对它们进行计数。

对于在环形道上丢失的波浪,您获得的选择取决于您当前的使用模式。那么你是否准备放慢速度增加点击量,以获得显着提升,找出你有多少?

+0

@tony:你能评论我的回答吗?这是一个好方法吗? – beck03076

2

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

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

查询的点击次数是多少?你的客户是否会查看它,或者每月检查一次?如果你只是时不时地看,我可能不会太在意选择count(*)的时间。

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

+0

是的,每个请求检查命中数量(没有API密钥,你每天获得有限的点击数)。那么我会用一个额外的领域的命中。谢谢。 – Stefan

1

既然我们的表格结构都是明确定义的,让我们开始工作。

你想记录的东西DB这是每个客户端访问的数据,在其他条款的次数,

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

你担心两件事情,

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

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

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

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

谢谢。

+0

有趣的做法,我会看看memcache,从来没有使用它 – Stefan

+0

而当服务器在一天结束之前崩溃会发生什么?你失去了所有这些统计 – tubaguy50035

+1

@ tubaguy50035:我没考虑过! – beck03076