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

时间:2011-10-02 09:35:01

标签: mysql optimization query-optimization binaryfiles large-data

reposted on 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

鉴于我在加载二进制csv文件中的数据方面的性能差异,首先我使用下面的调用加载了包含100K,1M,20M,200M行的二进制文件。

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

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

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

enter image description here

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

enter image description here

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

enter image description here

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

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

vs空数据库

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

0 个答案:

没有答案