我们得到了这个数据模型。知道有限的树深度,我们当前的表与模型是 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。
- 是否有任何显着不同/更好的方式来存储这种数据模型?
- 对于当前的结构,我们在这种大小/负载下遇到这种性能问题是否正常?机器是今天的平均硬件,没有嵌入式原子也没有8+核心野兽
- 拆分
Measurement
表是正确的做法吗?我们不是 SQL 专家,但查询和所需的索引看起来如此明显,以至于我们甚至没有考虑“优化”它。拆分有很大帮助,但其他东西也可能 - 有没有其他加速索引的方法?我们必须一遍又一遍地执行相同的索引,获得相同结果的子集,这有点愚蠢。我们永远不会使用任何其他索引,甚至不会更改为
desc
. 这是非常专业的设备。如果索引以某种方式是“本机顺序”会很好:-) - 是否有助于分发/分片拆分的
Measurement
表?正如我所说,有些表仍然很大,问题感觉是关于索引大小的分布无济于事,所以也许只是降低查询负载......