构建一个1,000M行的MySQL表

Ben*_*Ben 9 mysql optimization binaryfiles query-optimization large-data

转发到serverfault上

问题

问题1:随着数据库表的大小变大,如何调整MySQL以提高LOAD DATA INFILE调用的速度?

问题2:是否会使用一组计算机来加载不同的csv文件,提高性能还是杀死它?(这是我明天使用负载数据和批量插入的基准测试任务)

目标

我们正在为图像搜索尝试不同的特征检测器和聚类参数组合,因此我们需要能够及时构建大型数据库.

机器信息

如果有办法通过分发数据库来改善创建时间,那么机器有256 gig的ram,另外还有2台机器可以使用相同数量的ram?

表格式

表模式看起来像

+---------------+------------------+------+-----+---------+----------------+
| Field         | Type             | Null | Key | Default | Extra          |
+---------------+------------------+------+-----+---------+----------------+
| match_index   | int(10) unsigned | NO   | PRI | NULL    |                |
| cluster_index | int(10) unsigned | NO   | PRI | NULL    |                |
| id            | int(11)          | NO   | PRI | NULL    | auto_increment |
| tfidf         | float            | NO   |     | 0       |                |
+---------------+------------------+------+-----+---------+----------------+

到目前为止的基准测试

第一步是将批量插入与从二进制文件加载到空表中进行比较.

It took:  0:09:12.394571  to do  4,000  inserts with 5,000 rows per insert
It took: 0:03:11.368320 seconds to load 20,000,000 rows from a csv file
Run Code Online (Sandbox Code Playgroud)

鉴于性能上的不同,我从二进制csv文件加载数据,首先我使用下面的调用加载了包含100K,1M,20M,200M行的二进制文件.

LOAD DATA INFILE '/mnt/tests/data.csv' INTO TABLE test;

我在2小时后杀死了200M行二进制文件(~3GB csv文件).

所以我运行了一个脚本来创建表,并从二进制文件中插入不同数量的行然后删除表,请参见下图.

在此输入图像描述

从二进制文件插入1M行大约需要7秒钟.接下来,我决定一次插入1M行的基准测试,看看是否会出现特定数据库大小的瓶颈.一旦数据库达到大约59M行,平均插入时间就下降到大约5,000 /秒

在此输入图像描述

设置全局key_buffer_size = 4294967296可以略微提高插入较小二进制文件的速度.下图显示了不同行数的速度

在此输入图像描述

但是,为了插入1M行,它并没有提高性能.

行:1,000,000时间:0:04:13.761428插入/秒:3,940

vs一个空数据库

行:1,000,000时间:0:00:6.339295插入/秒:315,492