Ben*_*Ben 9 mysql optimization binaryfiles query-optimization large-data
问题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