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

Python 高吞吐量到mysql,安全插入?,python,mysql,python-3.x,performance,mariadb,Python,Mysql,Python 3.x,Performance,Mariadb,我从一个websocket连接接收大量接近并发级别的数据。数据以json格式提供,需要进入的表名和需要进入4列的数据(所有4列都是int或double,以显示数据类型和比例) 例如,假设我每秒获得1000行数据,需要转到大约100个不同的表(因此每秒每个表10行)。我对MySQL(特别是MariaDB)中这种规模的数据比较陌生。在开始这项工作之前,我是否需要担心这么快就写入数据库?如果在插入完成之前收到另一个查询,是否会有积压/是否会丢失未插入的数据?我是否可以判断是否丢失了数据 我的计划是在P

我从一个websocket连接接收大量接近并发级别的数据。数据以json格式提供,需要进入的表名和需要进入4列的数据(所有4列都是int或double,以显示数据类型和比例)

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

我的计划是在Python中编写,但如果这将是问题的话,它可以调整到C++(只有当它是一个问题时,不一定只是为了提高性能)。 完整数据流:

Websocket处理程序:

连接:wss://..../streams?=stream1&..stream100

回调:@process_data(msg)

我每秒得到大约1000毫秒

TL;DR:我会丢失数据/被这个设置搞砸吗?它在2个流的小范围内工作(我想,但我不知道我是否已经丢失了数据),但我需要显著地扩展它

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


编辑:我的数学!=“好”

< P>主要开销在MySQL,不是Python或C++,所以不要改变应用语言。 100
INSERTs
/second是我使用的截止时间——比这慢,MySQL/MariaDB“只是开箱即用”。比这更快,你可能需要一些调整

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

SSD可能会给你10倍

曾经有过每秒100万次的基准测试——但这并不仅仅适用于使用价格合理的硬件的普通人

InnoDB有几个可调参数可以更改。(
innodb\u flush\u log\u at\u trx\u commit=2
,例如)

至于“缺少数据”——这是代码另一面的问题。如果MySQL方面跟不上的话,它只会得到behinder和behinder

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

如果“streams”指的是“threads”,那么每个线程也必须有一个连接,除非您将数据反馈给单个线程来完成所有写入操作。任何一种方法都会奏效

为什么有100张桌子?如果所有的表本质上是相同的,那么它可能是一个“坏”的模式设计

构建一个测试框架来对代码进行压力测试。如果达到2000/秒,那么代码应该足够好,可以稳定地达到1000/秒

如果需要远远超过1000/秒,请参阅


PS:1000/100不等于100。

对于100个表,理论上可以更改,而数据本身是相同的,我需要为大型数据库上的所有未来事务添加group by(每天添加数百万行使其变得相当大)。我只是没有足够的经验来优化数据库,使之在将来能够足够快地在这样大小的表上进行后续读取查询。Python固有地将此JSON视为字典,因此它使用CPython来实现这一点。至于流,我连接到的websocket使用流发送什么信息。e、 g.标签。与100个大表相比,1个大表不会本质上改变
SELECT
针对如此多数据的性能。我认为你的数据是“适度的挑战”,而不是“恐慌,走出重炮”。可能有许多不同的方法;我们需要先了解哪些类型的数据,然后才能更具体地了解战术。谢谢你的帮助,詹姆斯先生。非常感谢。您已经给了我很多帮助,但随着我的不断学习,如果您认为在优化数据库方面有什么资源值得学习,我很乐意听到。@user3672480-Percona.com有很多好东西。我有,特别是关于索引的食谱。我可供租用(仅限小型演出)。
    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']
                                     )
                           )