建立多个数据库连接进行SQL插入有好处吗?
P粉585541766
P粉585541766 2024-03-30 08:39:46
0
1
276

我正在写一个与海量数据获取相关的项目。 目前我使用.NET Framework 4.8和Mysql包来启动连接并向数据库服务器插入数据。

我将插入大约 400, 000 行/秒。 我担心 SQL 连接可能成为我的程序的瓶颈。 我想知道如果我使用 sql 创建多线程连接并使用消费者队列插入数据,它会更快并且值得吗(优点和缺点)?

在我的直觉中,它会更快,但我不确定它可以在线程开销方面提供多少性能。我不是 SQL 专家,因此如果有人能够解释在多个线程上打开与 SQL 的多个连接的优缺点,那就太好了。

P粉585541766
P粉585541766

全部回复(1)
P粉373596828

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

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

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

批处理:

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

数据来源:

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

  • 标准化对于缩小磁盘占用空间很有用;最好分批进行。请参阅标准化
  • PARTITIONing 很少有用,除了最终清除旧数据之外。请参阅分区
  • 巨大的“事实”表很难搜索;考虑在摄取数据时构建摘要数据:汇总表
  • 甚至可以进行上述处理,然后扔掉原始数据。听起来您每天可能会获取一 TB 的数据。
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!