问题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
鉴于我在加载二进制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