【问题标题】:MySQL Optimization for LOAD DATA INFILEMySQL 对 LOAD DATA INFILE 的优化
【发布时间】:2017-05-28 23:21:51
【问题描述】:

我看到到处都有程序员为最快的LOAD DATA INFILE 插入进行优化。但他们从不解释他们的价值观选择等,优化取决于环境,也取决于实际的实际需求。

所以,请解释一下我的 mysql 配置文件中的最佳值是什么,以达到可能的最快插入速度。

我的配置,intel 双核 @ 3.30 GHz,4Gb DDR4 RAM(windows7 说“2.16Gb 可用”,因为保留了内存)。

我的 backup.csv 文件是大约 50 亿个条目的纯文本文件,因此它是一个 500Gb 的巨大文件大小,就像这个方案(但十六进制字符串长度为 64):

 "sdlfkjdlfkjslfjsdlfkjslrtrtykdjf";"dlksfjdrtyrylkfjlskjfssdlkfjslsdkjf"

我的表中只有两个字段,第一个是唯一索引。 ROW-FORMAT 设置为 FIXED 以解决节省空间的问题。出于同样的原因,字段类型设置为 BINARY(32)。

我正在使用 MyISAM 引擎。 (因为 innoDB 需要更多空间!)(MySQL 版本 5.1.41)

这是我现在计划使用的代码:

 ALTER TABLE verification DISABLE KEYS;
 LOCK TABLES verification WRITE;
 LOAD DATA INFILE 'G:\\backup.csv'
      IGNORE INTO TABLE verification
      FIELDS TERMINATED BY ';' ENCLOSED BY '"' LINES TERMINATED BY '\r\n'
      (@myhash, @myverif) SET hash = UNHEX(@myhash), verif = UNHEX(@myverif);
 UNLOCK TABLES;
 ALTER TABLE verification ENABLE KEYS;

如您所见,命令 use LOAD DATA INFILE 获取纯文本值,将它们转换为 HEX(最终都是十六进制哈希...)

我听说过缓冲区大小等,以及 MySQL 配置文件中的所有这些值。我应该改变什么,最好的价值是什么? 正如你所看到的,我已经锁定了桌子并禁用了加速它的键。

我还阅读了文档:

 myisamchk --keys-used=0 -rq /var/lib/mysql/dbName/tblName

在插入之前这样做也会加快速度。但真正的 tblName 是什么? (因为我有一个 .frm 文件、一个 .MYD 和一个 .MYI,所以我应该指向哪个文件?)

Here are the lasts short hints i did read about optimisation

编辑:忘了说,一切都是本地主机。

【问题讨论】:

    标签: mysql optimization myisam load-data-infile


    【解决方案1】:

    所以,我终于在大约 5 小时内成功地插入了包含超过 30 亿条条目的 500GB 数据库。

    我尝试了很多方法,在重建Primary Index 时,我遇到了这个错误ERROR 1034 (HY000): Duplicate key 1 for record at 2229897540 against new record at 533925080。

    现在我将解释我是如何完成插入的:

    • 我用GNU CoreUtils : sort.exe 对我的.csv 文件进行了排序(我在windows 上)记住这样做,你需要1.5 倍的csv 文件作为临时文件的可用空间。 (算上 .csv 文件,最终是 2.5 倍)
    • 您创建了包含索引和所有内容的表。
    • 执行mysqladmin flush-tables -u a_db_user -p
    • 执行myisamchk --keys-used=0 -rq /var/lib/mysql/dbName/tblName
    • 插入数据:(请勿使用ALTER TABLE tblname DISABLE KEYS; !!!)

      LOCK TABLES 验证写入;
      加载数据文件'G:\\backup.csv'
          IGNORE INTO TABLE 验证
          以“;”结尾的字段
          由'"'包围
          以“\r\n”结尾的行
          (@myhash, @myverif) SET hash = UNHEX(@myhash), verif = UNHEX(@myverif);
      解锁表格;
    • 插入数据时,通过执行myisamchk --key_buffer_size=1024M --sort_buffer_size=1024M -rqq /var/lib/mysql/dbName/tblName 重建索引 (注意-rqq,将q 加倍将通过尝试修复它们来忽略可能的重复错误(而不是在等待数小时后停止插入!)

    • 执行mysqladmin flush-tables -u a_db_user -p

    我已经完成了!

    • 我注意到如果.csv 文件位于数据库以外的另一个驱动器上,速度会大大提高,sort 操作也是如此,将临时文件放在另一个驱动器上。 (读/写速度不是两个数据都在同一个地方)

    来源再次在这里:Credits here to this solution

    【讨论】:

      【解决方案2】:

      我很确定这是验证,而不是 verification.MYD 或其他两个。 .MYD 是数据,.MYI 是索引,.frm 是架构。

      琴弦有多长?是十六进制吗?如果是 32 位十六进制数字,那么您不想将 BINARY(16) 用于 UNHEX 的输出吗?

      该过程的较长部分可能是ENABLE KEYS,即构建索引的时间。在它运行时执行SHOW PROCESSLIST;——如果它说“使用keybuffer”,杀死它,它将永远存在。如果它说“通过修复构建”之类的话,那么它很好——它正在排序,然后有效地加载索引。

      在开始进程之前,您可以通过设置myisam_data_pointer_size=5 节省 5GB 的磁盘空间。似乎也有myisam_index_pointer_size,但它可能默认为 5,这对于您的情况可能是正确的。 (我在 2004 年左右的 4.0 版中遇到过这种设置;但再也没有遇到过。)

      我认为key_buffer_size 在加载和索引过程中并不重要——因为你真的不希望它使用 key_buffer。不要将它设置得太高,以免内存不足。交换对于性能来说很糟糕。

      【讨论】:

      • 我绝对没有名为verification 的文件,无论如何我都会尝试,可能myisamchk 正在单独完成这项工作。数据是十六进制字符串,是的,长度为 64(所以 BINARY(32);我忘了在我的问题上提到这一点)。我的版本是mysql.exe Ver 14.14 Distrib 5.1.41, for Win32 (ia32)
      • 哦,对于myisam_data_pointer_size,它默认为6,所以没关系,因为5 不到50 亿。拥有一个 500Gb 的数据库,老实说,我不会为 5Gb 而战 =) 并且似乎我没有注册 myisam_index_pointer_size。
      • 您可能有 3 个文件 verification.MYD 等。好的,大约 64/32。 5.1 变得古色古香;考虑尽快升级。 6(默认,256TB 限制)和5(1TB 限制)是文件中“数据指针”中的字节数。 4(4GB 限制)太小了。
      • 谢谢。我试着直接输入myisamchk --keys-used=0 -rq mypath/verification,看起来 mysql 正在独自完成这项工作。我也升级到了最后一个 MySQL 版本。我正在等待我购买的新硬盘,然后尝试使用默认配置值...希望它不会花费几个月 ^^
      • 所以我回来了,必须整理我的 500GB .csv。花了很长时间。我按照您的指示以及我的问题链接中显示的指示进行操作。它在不到 2 小时内插入了所有 Data! (仅限.MYD)。在执行ENABLE KEYS; 部分时,它失败并出现错误ERROR 1034 (HY000): Duplicate key 1 for record at 2229897540 against new record at 533925080 使用给定的数字.. 看起来不是两条相邻的线?但是 .csv 肯定是排序的,并且使用带有唯一标志的 coreutils sort。你能帮我解决这个问题吗?还是我应该创建另一个问题?
      猜你喜欢
      • 2012-10-05
      • 2010-11-17
      • 1970-01-01
      • 2017-07-21
      • 2012-06-01
      • 2011-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多