import - 将数据导入 MariaDB 10.3 的性能问题
问题描述
我正在尝试在 MariaDB 10.3 中对一些大型 InnoDB 表进行分区。对于每个表,将数据插入这些表需要几个小时。这似乎太慢了。
这些表最初是在 MySQL 5.5 中构建的,最近升级到 MariaDB 10.3。此升级过程没有报告错误或警告。
这些表平均包含大约 2400 万行,每个表大约有 600 Mb 的数据。
对这些表进行分区遵循以下过程:
- 制作一个按范围分区的目标表的空副本(在日期时间列上),其中包含两个分区,一个用于保存早于定义日期的数据,另一个分区用于保存小于 MAXVALUE 的数据。
- 在这个空表中创建 100 个每周分区。
通过 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 需要几分钟,但我什至无法接近那个速度。我的表现似乎非常错误,但我无法确定问题。非常感谢我如何加快速度的任何想法?
解决方案
你为什么想要PARTITION
很多桌子?与明显的智慧相反,分区并没有提供任何内在的性能优势。
你尝试过ALTER TABLE .. ADD PARTITION ....
吗?这可能比 using 更快INSERT .. SELECT
,尽管我怀疑底层操作可能是相同的。
OriginalTable
有 2400 万(左右)行,对吗?(这将是一笔交易。)
你提到了很多核心;您是否尝试使用多个用户?
如果有几个这样的表,你最终会得到数百个分区。每个分区实际上是一个单独的“表”,因此需要table_open_cache
增加等值。
分区表上的索引通常需要不同于非分区表上的索引。你有考虑到这一点吗?
推荐阅读
- windows - 从命令行设置任务计划程序“配置为”参数
- python - 如何使用 Python 在列表中存储不同的元组?
- flutter - 在 Flutter Web 中上传多个文件(图像)
- python - 为什么我在此代码中收到 python 列表索引错误?
- time - Leetcode 二和问题。我的代码的时间复杂度是 O(n^2)。我怎样才能让它更简单
- python - 键盘模块的Python .write()函数问题
- mysql - MySQl如何使两个合并两个表的结果与联合全部或任何替代
- javascript - 如何以编程方式清除角度 QueryList
- socket.io - 如何在空手道上集成 socket.io
- c# - 在 netcore 3.1 中触发并忘记 SignalR 调用的简单方法