【发布时间】:2015-04-02 18:48:18
【问题描述】:
这是关于一个拥有大约 10 个产品供稿的网站。每天会多次导入 Feed。在每个导入阶段,我想将每个项目的sku 和price 保存在一个表中(以便在价格下跌超过 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上添加索引只会使脚本因“内部服务器错误”而崩溃,我已经尝试过了。 -
服务器正在崩溃,因为它是一个活动表。此表不断更新,无法被引擎锁定添加索引。
-
我建议您创建另一个表,一旦将数据插入此实时表中,该表也会更新。并且可以向其中添加索引,并且可以针对它提取任何报告。