我目前有一个MariaDB数据库,每天都会填充不同的产品(大约800个),并获取这些产品的价格更新。
我在价格/产品表的顶部创建了一个视图,该视图可生成统计数据,例如最近7天,15天和30天的平均值,均值和众数,并计算出当前价格与7、15和30天。
问题是,每当我运行此视图时,将花费近50秒钟来生成数据。 我看到了一些有关切换到计算表的评论,在该表中,当将新数据输入到表中时,计算将被更新,但是我对此表示怀疑,因为我要在一个特定的位置插入大约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
如果切换到计算表,是否有最佳方法?