suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Hat die Einrichtung mehrerer Datenbankverbindungen für SQL-Einfügungen einen Vorteil?

Ich schreibe ein Projekt im Zusammenhang mit der Erfassung massiver Daten. Derzeit verwende ich .NET Framework 4.8 und das MySQL-Paket, um Verbindungen zu initiieren und Daten in den Datenbankserver einzufügen.

Ich werde etwa 400.000 Zeilen pro Sekunde einfügen. Ich befürchte, dass die SQL-Verbindung zu einem Engpass für mein Programm werden könnte. Ich möchte wissen, ob es schneller ist und sich lohnt (Vor- und Nachteile), wenn ich SQL zum Erstellen einer Multithread-Verbindung verwende und die Verbraucherwarteschlange zum Einfügen von Daten verwende.

In meinem Bauch wäre es schneller, aber ich bin mir nicht sicher, wie viel Leistung es in Bezug auf den Thread-Overhead bieten würde. Ich bin kein SQL-Experte, daher wäre es großartig, wenn jemand die Vor- und Nachteile des Öffnens mehrerer SQL-Verbindungen in mehreren Threads erklären könnte.

P粉585541766P粉585541766239 Tage vor330

Antworte allen(1)Ich werde antworten

  • P粉373596828

    P粉3735968282024-03-31 00:42:10

    谣言、观点、道听途说、事实、版本相关的基准、一些个人经验等......

    多线程可以提高吞吐量,但也有限制:

    • 吞吐量上限约为理论极限的一半。 (你的“一定百分比”)(这是基于多线程包的基准;我忘记了名字;那是十年前的事了。)
    • 多个线程将在互斥体和其他必要的锁定机制上相互竞争。
    • 从大约 5.7 开始,64 个线程是 MySQL 的多线程限制;超过这个值,吞吐量就会停滞甚至下降。 (来源:许多 Oracle 基准测试都吹嘘一个版本比前一个版本好得多。)(与此同时,每个线程的延迟都达到了顶峰。)
    • 如果可能,每个线程都应批量处理数据。

    批处理:

    • LOAD DATA 是一次从单个线程 INSERT 大量行的最快方法。但是,如果您包括将文件写入 LOAD 的成本,则可能会使其比批量插入慢。
    • 批量 INSERT 紧随其后。但当达到某个限制或“收益递减”时,它的上限为“数百”行。
    • 批量插入的速度是每次 INSERT 查询插入一行的速度的 10 倍。因此,它(或 LOAD DATA)值得用于高速摄取。 (来源:许多不同的定时测试。)

    数据来源:

    加载数据后会发生什么?当然,这不是一个只写不读的表。

    • 标准化对于缩小磁盘占用空间很有用;最好分批进行。请参阅标准化
    • PARTITIONing 很少有用,除了最终清除旧数据之外。请参阅分区
    • 巨大的“事实”表很难搜索;考虑在摄取数据时构建摘要数据:汇总表
    • 甚至可以进行上述处理,然后扔掉原始数据。听起来您每天可能会获取一 TB 的数据。

    Antwort
    0
  • StornierenAntwort