【问题标题】:Optimizing table structure for logging data over time优化表结构以随时间记录数据
【发布时间】:2015-04-02 18:48:18
【问题描述】:

这是关于一个拥有大约 10 个产品供稿的网站。每天会多次导入 Feed。在每个导入阶段,我想将每个项目的skuprice 保存在一个表中(以便在价格下跌超过 10% 时通过邮件提醒)。

目前我将这些数据存储如下:

primary_key   sku     price datetime
1             XYX     1     2015-04-02 20:10:59  
2             ZYZ     2     2015-04-02 20:10:59
3             XYX     2     2015-04-03 20:10:59
4             XYX     0.5   2015-04-04 20:10:59

对于 sku XYX,价格演变为 1 -> 2 -> 0.5 。在这个阶段我想发送一封警告邮件。我知道该怎么做。问题是,随着每个产品提要,表格会增加大约 50.000 行。尝试通过以下查询获取结果时:

SELECT sku,
       group_concat(cast(price as char(10)) separator '->') 
FROM table1 
GROUP BY sku 
ORDER BY datetime

...至少需要 5 秒。随着时间的流逝,表中的行数会更多,查询时间也会增加。例如,我可以删除超过 4 天的记录(因为周末)。

我想把这张表做成如下:

id    sku    price
1     XYX    1->2->3->2.3
2     VZV    5->6->5->5.5

...但在这种情况下,我将无法“能够”按日期删除旧记录,并且价格列必须是文本/blob,这可能会对查询时间组合产生重大影响(php + mysql )。

运行最快的查询是什么?

谢谢!

【问题讨论】:

  • 大量数据占用大量空间。大量数据需要大量时间来处理。在我看来,你现在的结构是正确的。
  • 您需要在 sku 和 price 列上添加索引。索引有助于优化查询执行。
  • @user2411276:在sku 上添加索引只会使脚本因“内部服务器错误”而崩溃,我已经尝试过了。
  • 服务器正在崩溃,因为它是一个活动表。此表不断更新,无法被引擎锁定添加索引。
  • 我建议您创建另一个表,一旦将数据插入此实时表中,该表也会更新。并且可以向其中添加索引,并且可以针对它提取任何报告。

标签: php mysql


【解决方案1】:

group_concat 存在一个众所周知的性能问题,但使用 DISTINCT 不是您的情况。

尝试添加索引price列:

ALTER TABLE `products` ADD INDEX `price` (`price`)

因为是使用group_concat 并运行查询以检查性能是否更好。另外,我会听从@symcbean 的建议。

另一个解决方案是有两个单列索引,正如@user2411276 所建议的那样。

如果您有一个包含两列的索引,则查询可能会更快(您应该衡量)。两列索引也可以用作单列索引,但仅适用于首先列出的列。

有时在 (A,B) 上有一个索引,在 (B) 上有另一个索引会很有用。这会使用其中一个或两个进行查询,但也会占用更多磁盘空间。

在选择索引时,还需要考虑插入、删除和更新的效果。 索引更多,更新速度较慢,开始测试吧,祝你好运!

【讨论】:

    【解决方案2】:

    在 sku 和价格列上创建索引:

    alter table <table_name> add INDEX indx_sku (sku,price);
    

    【讨论】:

    • 这不会使 valicu2000 发布的唯一查询变得更快。
    【解决方案3】:

    虽然存在在同一行(多个字段)中存储多个值的论点,但大多数人会同意,当适当规范化的解决方案无法满足您的需求时,这应该是最后的手段,但是我怀疑任何有任何重要经验的人使用关系数据库会认为将多个值放入同一个字段是一个好主意。

    您现在有性能问题吗?如果是这样,请发布另一个带有查询、架构和解释计划的问题。

    您在此处向我们展示的查询将读取数百万行,因此,是的,这需要时间。优化模式/处理可能有很大的空间,例如仅在 SKU 的价格发生变化时添加记录,但这可能会对其他地方产生很大影响。

    【讨论】:

      猜你喜欢
      • 2017-09-01
      • 1970-01-01
      • 2011-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-10
      相关资源
      最近更新 更多