【问题标题】:Performance problem importing data into MariaDB 10.3将数据导入 MariaDB 10.3 的性能问题
【发布时间】:2018-11-05 14:40:59
【问题描述】:

我正在尝试在 MariaDB 10.3 中对一些大型 InnoDB 表进行分区。对于每个表,将数据插入这些表需要几个小时。这似乎太慢了。

这些表最初是在 MySQL 5.5 中构建的,最近升级到 MariaDB 10.3。此升级过程没有报告错误或警告。

这些表平均包含大约 2400 万行,每个表大约有 600 Mb 的数据。

按照以下过程对这些表进行分区:

  1. 创建一个目标表的空副本,按范围分区(在日期时间列上),其中包含两个分区,一个用于保存早于定义日期的数据,另一个分区用于保存小于 MAXVALUE 的数据。
  2. 在这个空表中创建 100 个每周分区。
  3. 通过select语句将数据插入到这个表中:

    INSERT INTO new_table SELECT * from originalTable;

我使用的 MariaDB 版本是 10.3.9

全局变量是默认值,除了:

autocommit = OFF
global_max_allowed_packet = 1073741824
innodb_buffer_pool_size = 10737418240
innodb_doublewrite = OFF

这是在具有 65GB 内存和 40 个 3G 内核的 CentOS 版本 7.2.1511 上运行的。

我在网上看到导入 300Mb 需要几分钟,但我什至无法接近那个速度。我的表现似乎非常错误,但我无法确定问题。非常感谢有关如何加快速度的任何想法?

【问题讨论】:

  • 我知道自动提交已关闭,但您是否尝试将其包装在 BEGIN/COMMIT 中?

标签: import mariadb partitioning


【解决方案1】:

你为什么要PARTITION很多桌子?与显而易见的智慧相反,分区并没有提供任何内在的性能优势。

您尝试过ALTER TABLE .. ADD PARTITION .... 吗?这可能比使用INSERT .. SELECT 更快,但我怀疑底层操作可能是相同的。

OriginalTable 有 2400 万(左右)行,对吗? (这将是一次交易。)

你提到了很多核心;您是否尝试使用多个用户?

如果有多个这样的表,您最终会得到数百个分区。每个分区实际上是一个单独的“表”,因此需要增加 table_open_cache 等值。

分区表上的索引通常需要不同于非分区表上的索引。你有考虑到这一点吗?

【讨论】:

  • 感谢您的回复。我警告说,对表进行分区不一定会提高性能,而这是他们的目标。我没有尝试更改现有表,因为这种方法似乎可以最大限度地减少停机时间。但是,将数据插入其中一张表需要 11 个多小时。这种缓慢的速度似乎表明这台机器的配置或设置存在重大问题,但我不明白它是什么。加载一张表时,它似乎分叉了 4 个线程来执行 IO 操作。
  • @KirtHall - 从技术上讲,是的,I/O 有额外的线程。这些在所有 InnoDB 连接之间共享。尽管如此,在ALTERINSERT 中一次只处理一行。请在转换前后提供SHOW CREATE TABLE。如果可行,一些查询。我很乐意批评向分区的转换——指出陷阱、需要更改索引等。
  • @KirtHall - 同时,您可以争辩说,添加分区的技术细节证明不进行分区是合理的。告诉“他们”,可能还有其他途径可以提高绩效。
猜你喜欢
  • 1970-01-01
  • 2012-01-05
  • 2022-09-29
  • 2021-03-20
  • 1970-01-01
  • 1970-01-01
  • 2015-10-11
  • 2017-02-08
  • 1970-01-01
相关资源
最近更新 更多