我们得到了这个数据模型。知道有限的树深度,我们当前的表与模型是1:1,具有父节点的外键。 Channel
到Station
,Measurement
到Channel
和Station
。 90%的查询是:
select value from measurements where
fk_station=X and fk_channel=Y and timestamp>=A and timestamp<=B
order by timestamp asc
其余10%在其他带时间戳的表上类似,但由于缺少fk_channel
而更简单。
我们面临的问题: [station,channel,timestamp]
表中有数亿个独特的Measurement
行并且正在增长。时间戳索引是如此巨大,而且排序条款太慢了,我们不得不按 Station Id 开始拆分它;所以我们有表Measurement_<Station Id>
并且省略了Station
外键。它有很大帮助,但仍有一些表有数千万行。在负载峰值中,我们获得了大约80000个查询/分钟,并且对这些较大的表的查询显然更加懒散。我们仍然从一个MySQL / ISAM实例运行,没有任何花哨的优化黑客。文件系统大约150GB。
Measurement
表分拆正确的事情吗?我们不是SQL专家,但查询和所需的索引似乎很明显,我们甚至没有考虑“优化”它。分裂帮了很多,但其他东西也可能太多了desc
。这是非常专业的设备。如果索引以某种方式“本地订单”会很好: - )Measurement
表?正如我所说,一些表仍然很大,问题感觉是关于索引大小的分布无济于事,所以也许只是降低查询负载...... 答案 0 :(得分:1)
在mysql这样的关系数据库中考虑的简单规则:
答案 1 :(得分:0)
是否有可能在多个表上拆分测量数据可以减小尺寸?如果90%的查询超过过去24小时的时间戳,那么您可能希望微调该数据,并将其余查询存储在单独的表甚至数据库中。我相信测量应该只有一个FK只有通道,它只有它的ID作为PK,而一个FK到站。