我从一个websocket连接中接收到了大量几乎并发级别的数据。数据以json格式输入,它需要进入的表名和需要进入4列的数据(所有4个都是int或types,以给出数据类型和比例的含义)。
例如,假设我每秒获得1000行数据,需要转到大约100个不同的表(所以每秒10行)。对于MySQL中的这种数据规模(特别是MariaDB),我还是比较陌生的。在我开始做这件事之前,我需要这么快地写到DB上吗?如果在插入完成之前获得另一个查询,是否会丢失未插入的数据?不管怎么说,我能判断我是否丢失了数据吗?
我的计划是用python编写,但如果这是问题的话,可以调整到C++ (只有当它是一个问题时,而不一定只是为了提高性能)。
全数据流:
Websocket:
connect:wss://..../streams?=stream1&..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博士:我会丢失数据/搞砸这个设置吗?它可以在一个小的基础上与两个流(我想,但我不知道我是否已经失去数据),但我需要大大扩大它。
抱歉,如果这是个愚蠢的问题。
编辑: MyMaths !=“好”
发布于 2018-06-05 04:40:15
主要开销是MySQL,而不是Python或C++,所以不要更改应用程序语言。
100 INSERTs/second是我使用的截止点--比它慢,而MySQL/MariaDB“只是开箱即用”。比这更快,你可能需要做些调整。
在实际情况下,通过在单个INSERT语句中插入多个行可以得到很好的提升。我认为python对此有一个特别的要求。每次插入100行(到一个表中)的速度大约是每INSERT一行的10倍。
SSD可能给你10倍。
曾经有100万/秒的基准--但这并不仅仅是凡人可以负担得起的硬件。
对于InnoDB,有几个可调性可以更改。(例如innodb_flush_log_at_trx_commit=2)。
至于“丢失数据”--这是代码的另一面的问题。如果MySQL不能跟上,它就会受到阻碍和阻碍。
我假设python有一个很好的库来解析JSON?
如果你所说的“流”,你指的是“线程”,那么你也必须每个线程有一个连接,除非你将数据反馈回一个线程来完成所有的写入。这两种方法都会奏效。
为什么有100张桌子?如果所有表本质上是相同的,那么它可能是一个“糟糕”的模式设计。
构建一个测试框架来强调测试您的代码。如果您获得2000/秒,那么代码应该足够稳定地执行1000/秒。
如果您需要超过1000/秒,请参见table
PS: 1000 / 100不等于100。
https://stackoverflow.com/questions/50691759
复制相似问题