高吞吐量到mysql,安全插入?

问题描述 投票:0回答:1

我从单个websocket连接接收了很多并发级别的数据。数据以json格式输入,需要进入表名,需要进入4列的数据(所有4个都是int或double,以便了解数据类型和比例)。

例如,假设我每秒获得1000行数据,需要转到大约100个不同的表(每秒每表10行)。我对MySQL(特别是MariaDB)中的这种数据规模相对较新。在我开始这个之前,我是否需要担心这么快写入数据库?如果我在插入完成之前得到另一个查询,是否会有积压/可能会丢失未插入的数据?无论如何,我可以判断我是否缺少数据?

我的计划是在python中编写,但是如果这将是问题,可以适应C ++(只有这将是一个问题,不一定只是为了提高性能)。

完整数据流:

Websocket处理程序:

连接:WSS://..../streams =流1&.. stream100

回调:@process_data(msg)

    def process_data(msg):
        #msg exp: {"table":"stream1", "v1":100, "v2":101, "v3":.000005, "v4":.0002} 
        connection.execute("""INSERT INTO {} 
                              VALUES ({}, {}, {}, {})
                           """.format(
                                      msg['table'], 
                                      msg['v1'],
                                      msg['v2'],
                                      msg['v3'],
                                      msg['v4']
                                     )
                           )

而我每秒大约有1000个消息。

TL; DR:我会丢失数据/搞砸这个设置吗?它工作在一个小的基础上有两个流(我想,但我不知道我是否已经丢失数据),但我需要大幅度扩展它。

对不起,如果这是一个愚蠢的问题。

编辑:MyMaths!=“好”

python mysql python-3.x performance mariadb
1个回答
0
投票

主要的开销是MySQL,而不是Python或C ++,因此不要更改应用程序语言。

100 INSERTs /秒是我使用的截止 - 比这慢,而MySQL / MariaDB“只是开箱即用”。比这更快,你可能需要一些调整。

在可行的情况下,通过在单个INSERT语句中插入多行来获得良好的提升。我认为python有一个特殊的要求。一次插入100行(到一个表中)的速度大约是每个INSERT一行的10倍。

SSD可能会给你10倍。

已经有1M /秒的基准测试 - 但这不仅适用于价格适中的硬件上的凡人。

可以为InnoDB更改一些可调参数。 (例如,innodb_flush_log_at_trx_commit=2)。

至于“缺失数据” - 这是代码另一面的问题。如果它无法跟上,那么MySQL方面只会变得更好而且更好。

我假设python有一个很好的库来解析JSON?

如果通过“streams”,你的意思是“线程”,那么你每个线程也必须有一个连接,除非你将数据反馈给一个线程来完成所有的写操作。无论哪种方式都可行。

为什么有100张桌子?如果所有表基本相同,那么它可能是一个“坏”的架构设计。

构建测试框架以压力测试代码。如果你得到2000 /秒,那么代码应该足够好,可以稳定地做到1000 /秒。

如果你需要超过1000 /秒,请参阅http://mysql.rjweb.org/doc.php/staging_table

PS:1000/100不等于100。

© www.soinside.com 2019 - 2024. All rights reserved.