在MariaDB / MySQL中存储实时时间序列的最佳解决方案是什么?

使用案例:测量创建给定数量的图像.对于每个图像,我们需要存储一小组质量指标(浮点数,双精度数)以及图像整数[1 … N],时间戳和一个或两个外键值.然后,应在Web应用程序(PHP)中“实时”绘制,以供用户评估.

每个Web客户端每5秒轮询一次数据库.理想情况下,每组质量指标的存储检索应采用< 2s(约).在最糟糕的情况下,可以同时进行约30个Web客户端轮询,并且可以同时写入大约10个测量值,从而导致写入突发大约.每秒1000套质量指标. 在编程语言中,这种数据可能存储在数组或列表中.由于我不知道MariaDB / MySQL世界中有类似的东西,我只是使用一个常规的InnoDB表,其中包含上面提到的每个值的列.这已经有9000万行,预计在未来几个月内增长更快. InnoDB总体上是最好的存储引擎,还是我应该考虑其他?最好的做法是在一段时间后归档数据,也许一旦所有测量图像都被处理完毕?是否有助于实现压缩,或者会对性能产生非常不利的影响?

解决方法:

只使用MySQL,我会使用:

>高速摄取:http://mysql.rjweb.org/doc.php/staging_table
>摘要表(以便更快地获取数据):http://mysql.rjweb.org/doc.php/summarytables
>我甚至会考虑不存储原始数据;而是汇总数据,然后扔掉它.如果这是实用的,它可以避免你提出的大多数问题.
>(如果数据需要清除):快速删除旧数据:http://mysql.rjweb.org/doc.php/partitionmaint
>因为额外的开销,我会避免使用FOREIGN KEYS. (相反,我会调试SQL.)
>我不会使用UUID密钥;性能在巨大的表格中贬值. (http://mysql.rjweb.org/doc.php/uuid)
>我会避免额外的索引 – 如果其他一些列是唯一的,请不要使用AUTO_INCREMENT.
>你提到空间 – 请详细说明. 2D查找很棘手; SPATIAL是一种方法;这是另一个:http://mysql.rjweb.org/doc.php/latlng

你的最后一段抛出问题的厨房水槽(Toku,MyRocks,档案,压缩,历史表).我很惊讶这篇文章并没有被“太宽泛”所杀死.请详细说明您的数据和查询是什么样的;否则,我们所能做的就是抛出一个充满解决方案的厨房水槽.

你说“实时”,但你需要“千/秒”.你能实时延迟1分钟吗? 1秒?你不能得到1毫秒; 1s很难实现.爆发持续多久?什么是每分钟爆发? 1K /秒可能会在接下来的几秒内泄漏. 6K /分钟并不是很麻烦.

有多少客户端存储数据?一些解决方案适用于单个客户端;多个客户需要不同的解决方案.

请记住,基准测试是为了炫耀一件事,很少与现实生活相匹配.

上一篇:mysql – 在pt-query-digest输出之上的COMMIT


下一篇:Percona MySQL 5.5唯一密钥是重复的