【发布时间】:2020-02-26 04:41:05
【问题描述】:
我目前有一个 MariaDB 数据库,每天都会填充不同的产品(大约 800 种),并且还会获取这些产品的价格更新。
我在价格/产品表的顶部创建了一个视图,该视图生成了过去 7 天、15 天和 30 天的平均值、平均值和众数等统计数据,并计算了今天价格与 7 天平均值之间的差异、15 天和 30 天。
问题在于,每当我运行此视图时,生成数据需要将近 50 秒。我看到一些关于切换到计算表的 cmets,其中计算将在新数据输入表时更新,但是我对此持怀疑态度,因为我在一个特定的位置插入了大约 1000 个价格点一天中会影响表格上所有计算的时间。计算表是仅更新已更新的行,还是会重新计算所有内容?我担心这可能会导致开销(内存不是服务器的问题)。
我已将产品和价格表以及视图粘贴到 DBFiddle,这里:https://dbfiddle.uk/?rdbms=mariadb_10.2&fiddle=4cf594a85f950bed34f64d800601baa9
产品代码22141计算可见
只是为了给出一个想法,这些是视图完成的一些计算(在小提琴上也可用):
ROUND((((SELECT preconormal
FROM precos
WHERE codigowine = vinhos.codigowine
AND timestamp >= CURRENT_DATE - INTERVAL 9 HOUR) / (SELECT AVG(preconormal)
FROM precos
WHERE codigowine = vinhos.codigowine
AND timestamp >= CURRENT_DATE - INTERVAL 7 DAY) - 1) * 100), 2) as dif_7_dias,
ROUND((((SELECT preconormal
FROM precos
WHERE codigowine = vinhos.codigowine
AND timestamp >= CURRENT_DATE - INTERVAL 9 HOUR) / (SELECT AVG(preconormal)
FROM precos
WHERE codigowine = vinhos.codigowine
AND timestamp >= CURRENT_DATE - INTERVAL 15 DAY) - 1) * 100), 2) as dif_15_dias,
ROUND((((SELECT preconormal
FROM precos
WHERE codigowine = vinhos.codigowine
AND timestamp >= CURRENT_DATE - INTERVAL 9 HOUR) / (SELECT AVG(preconormal)
FROM precos
WHERE codigowine = vinhos.codigowine
AND timestamp >= CURRENT_DATE - INTERVAL 30 DAY) - 1) * 100), 2) as dif_30_dias
如果切换到计算表,是否有最佳方法?
【问题讨论】:
-
您的表上没有索引
-
他们在现实生活中这样做,以及 codigowine 是价格表中产品的 FK 和产品上的 PK。很抱歉没有添加。
-
好的。稍后我将优化您的查询,但我无法用小数据测试性能。然后你可以在你的系统上测试它
-
每种产品每天多少个价格?如果很多,则构建并维护一个汇总表,每天每个产品一行。
标签: mysql date join mariadb query-performance