【问题标题】:MySQL Performance - "Redundancy" vs Speed/System PerformanceMySQL 性能 - “冗余”与速度/系统性能
【发布时间】:2012-05-14 21:17:16
【问题描述】:

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

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

【问题讨论】:

    标签: php mysql performance redundancy


    【解决方案1】:

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

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

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

    【讨论】:

    • @tony:你能评论我的回答吗?这是个好方法吗?
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 是的,每次请求都会检查点击量(如果没有 API 密钥,您每天只能获得有限的点击量)。然后,我将使用一个额外的字段来进行点击。谢谢。
    【解决方案3】:

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

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

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

    你担心两件事,

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

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

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

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

    谢谢。

    【讨论】:

    • 有趣的方法,我看看 memcache,没用过
    • 当服务器在一天结束之前崩溃时会发生什么?你失去了所有这些统计数据
    • @tubaguy50035 :我没想到!
    • 显然,这完全取决于数据对您的重要性。如果它只是一种“值得拥有”的东西,那么丢失一天的数据可能并不可怕。如果是这样,您仍然可以将 memcache 与某种 cron 作业一起使用,该作业会每隔一段时间将当前计数写入数据库。
    • memcache 方法对于此类数据可能是一种不错的方法。您可能会时不时地丢失一批,但除非您非常不走运,否则它不会对您根据此类数据建立的统计数据产生影响。我在高完整性系统上工作,所以这不是我会想到的那种解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    相关资源
    最近更新 更多