【问题标题】:high throughput to mysql, safe inserts?mysql的高吞吐量,安全插入?
【发布时间】:2018-11-14 10:46:19
【问题描述】:

我从单个 websocket 连接接收到接近并发级别的大量数据。数据以 json 格式出现,需要进入的表名和需要进入 4 列的数据(所有 4 列都是 int 或 doubles,以了解数据类型和规模)。

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

我的计划是用 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;DR:我会丢失数据/弄乱这个设置吗?它在 2 个流的小范围内工作(我认为,但我不知道我是否已经丢失数据),但我需要显着扩展它。

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

编辑:MyMaths != "good"

【问题讨论】:

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


    【解决方案1】:

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

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

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

    SSD 可能会给你 10 倍。

    已经有 1M/秒的基准测试 - 但这并不适合普通人使用负担得起的硬件。

    有一些可调参数可以针对 InnoDB 进行更改。 (例如innodb_flush_log_at_trx_commit=2)。

    至于“缺少数据”——这是代码另一端的问题。 MySQL 跟不上,只会越来越落后。

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

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

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

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

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

    PS:1000 / 100 不等于 100。

    【讨论】:

    • 至于 100 个表,理论上可以更改,虽然数据本身是相同的,但我需要为大型数据库上的所有未来事务添加 group by(每天添加数百万行会使它长得很大)。我只是没有足够的经验来将数据库优化到一个水平,以便将来在该大小的表上足够快地获得后续读取查询。 Python 天生将此 JSON 视为字典,因此它使用 CPython 来完成。至于流,我连接的 websocket 使用流来发送什么信息。例如标签。
    • 拥有 1 个大表与 100 个大表并不会从本质上改变 SELECT 针对这么多数据的性能。我认为你的数据是“适度具有挑战性”,而不是“恐慌,摆脱重炮”。有许多不同的方法可能;在更具体地了解战术之前,我们需要先查看数据类型。
    • 感谢詹姆斯先生的帮助。非常感激。你已经给了我很多帮助,但是随着我的不断学习,如果有任何资源你会说在优化数据库方面非常有用,我很想听听。
    • @user3672480 - Percona.com 有很多好东西。我有 mysql.rjweb.org ,尤其是关于索引的食谱。我可以租用(仅限小型演出)。
    猜你喜欢
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多