用例:测量创建给定数量的图像。对于每个图像,我们需要存储一小组质量指标(浮点数、双精度数)以及图像整数 [1 ...N]、时间戳和一个或两个外键值。然后应该在 Web 应用程序 (PHP) 中“实时”绘制,供用户评估。
每个 Web 客户端每 5 秒轮询一次数据库。理想情况下,每组质量指标的存储 + 检索时间应小于 2 秒(大约)。在最坏的情况下,可能有大约 30 个同时 Web 客户端轮询,并且可能同时写入大约 10 个测量值,导致大约 10 个写入突发。每秒1000组质量指标。
在编程语言中,这种数据可能存储在数组或列表中。由于我不知道 MariaDB / MySQL 世界中有任何类似的东西,我只是使用一个常规的 InnoDB 表,上面提到的每个值都有一个列。这已经有 90+ 百万行,预计在未来几个月内增长更快。
InnoDB 总体上是最好的存储引擎,还是我应该考虑其他?最好的做法是在一段时间后存档数据,也许是在处理完所有测量图像后?是否有助于启用压缩,或者这会对性能产生非常负面的影响?
仅使用 MySQL/MariaDB,我将采用:
FOREIGN KEYS
由于额外的开销,我会避免。(相反,我会调试 SQL。)AUTO_INCREMENT
我会避免使用额外的索引——如果其他一些列是唯一的,请不要使用。SPATIAL
是一种方法;这是另一个:http: //mysql.rjweb.org/doc.php/latlng你的最后一段抛出了问题的厨房水槽(Toku、MyRocks、存档、压缩、历史表)。我很惊讶这个帖子没有因为“太宽泛”而被杀。请详细说明您的数据和查询是什么样的;否则,我们所能做的就是扔一个装满解决方案的厨房水槽。
你说“实时”,但你需要“千/秒”。你能允许实时延迟 1 分钟吗?1秒?你不能得到 1ms;1s将很难实现。爆发持续多长时间?什么是每分钟爆发?1K/sec 可能会在接下来的几秒钟内溢出。6K/分钟也不是很麻烦。
有多少客户端正在存储数据?一些解决方案适用于单个客户端;多个客户需要不同的解决方案。
请记住,基准测试是为了炫耀一件事而调整的,很少与现实生活相匹配。
那里有一些大问题可能需要比这里更仔细的检查,因为有很多依赖项(意识到你知道这一点!)。Percona Live 和 Percona Live Europe 页面上的演示文稿中有许多幻灯片集,这些幻灯片集可能会帮助您进一步了解时间序列。例如,关于使用 Yandex 的 ClickHouse
https://www.percona.com/live/17/program/schedule/time-series
https://www.percona.com/live/e17/program-open-source-databases
您可能还会发现一些博客文章很有趣。这篇文章着眼于 TokuDB 与 InnoDB 的时间序列基准。
https://www.percona.com/blog/2013/09/05/tokudb-vs-innodb-timeseries-insert-benchmark/
而这个关注 MongoDB 和 TokuMX https://www.percona.com/blog/2015/05/26/storing-time-series-data-with-mongodb-and-tokumx/
希望这些帮助。