python - mysql的高吞吐量,安全插入?

标签 python mysql python-3.x performance mariadb

我从单个 websocket 连接接收大量接近并发级别的数据。数据采用 json 格式,包含需要进入的表名和需要进入 4 列的数据(所有 4 列都是 int 或 double,以了解数据类型和范围)。

例如,假设我每秒获取 1000 行数据,需要访问大约 100 个不同的表(因此每个表每秒 10 行)。我对 MySQL(特别是 MariaDB)中这种规模的数据比较陌生。在开始之前,我是否需要担心写入数据库的速度这么快?如果在插入完成之前收到另一个查询,是否会出现积压/是否会丢失未插入的数据?无论如何我可以知道我是否丢失了数据吗?

我的计划是用 python 编写,但如果这将成为问题,则可以调整为 C++(仅当它将成为问题时,不一定只是为了提高性能)。

完整数据流:

Websocket 处理程序:

连接: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;DR:此设置会丢失数据/弄乱吗?它在 2 个流的小型基础上工作(我认为,但我不知道我是否已经丢失数据),但我需要显着扩大规模。

抱歉,如果这是一个愚蠢的问题。

编辑:MyMaths!=“好”

最佳答案

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

100 INSERTs/秒是我使用的截止值——比这慢,并且 MySQL/MariaDB“开箱即用”。比这更快,您可能需要一些调整。

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

SSD 可能会给你 10 倍的性能。

已经有 100 万/秒的基准——但这并不适合普通人使用经济实惠的硬件。

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

至于“丢失数据”——这是代码另一方的问题。如果 MySQL 跟不上,它就会越来越落后。

我认为 python 有一个很好的库来解析 JSON?

如果“流”指的是“线程”,那么每个线程还必须有一个连接,除非您将数据反馈给单个线程来完成所有写入操作。无论哪种方式都会起作用。

为什么有 100 张 table ?如果所有表本质上都是相同的,那么它可能是一个“糟糕”的架构设计。

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

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

PS:1000/100 不等于 100。

关于python - mysql的高吞吐量,安全插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50691759/

相关文章:

python - 如何编写 python 程序从磁盘镜像文件(.raw 文件)中读取数据?

用于在长列表中查找唯一名称的 Python 命令

mysql - 如何使用mysql随机排序结果?

mysql - 无法使用 pymysql 从我的 sql 数据库检索数据

python-3.x - pyspark写入wasb blob存储容器

python - 创建开放的街道 map View

python - 使用 Boost.python 将 Python 列表传递给 C++ 向量

python - Pymunk 中的每体阻尼与空间阻尼复合吗?

php - 在 PHP 中从 MySQL 数据库创建超链接

mysql - 为什么这个 DELETE 查询不起作用?