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

时间:2018-06-05 03:55:08

标签: python mysql python-3.x performance mariadb

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

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

我的计划是用python编写,但如果问题出现就可以适应C ++(只有这样才会出问题,不一定只是为了提高性能)。

完整数据流:

Websocket Handler:

连接: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:我是否会丢失数据/搞砸了这个设置?它的工作量很小,有2个流(我想,但我不知道我是否已经丢失了数据),但我需要大幅度扩展它。

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

编辑:MyMaths!="好"

1 个答案:

答案 0 :(得分: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。