我在任何地方都可以看到最快的LOAD DATA INFILE
插入的程序员。但是他们从不解释自己的价值选择等太多,而优化取决于环境以及实际的实际需求。
所以,想要一些解释我的mysql配置文件中最佳值以达到最快的插入,请。
我的配置,一个英特尔双核 @ 3.30 GHz,4GB DDR4 RAM(Windows7说" 2.16GB可用",因为保留存储器(。
我的backup.csv文件是大约50亿个条目,因此它的500GB文件大小如此schem(但六核字符串64长(:
"sdlfkjdlfkjslfjsdlfkjslrtrtykdjf";"dlksfjdrtyrylkfjlskjfssdlkfjslsdkjf"
我的表中只有两个字段,第一个字段是唯一的索引。固定在固定上以节省空间问题。出于同样的原因,字段类型被设置为二进制(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 'rn'
(@myhash, @myverif) SET hash = UNHEX(@myhash), verif = UNHEX(@myverif);
UNLOCK TABLES;
ALTER TABLE verification ENABLE KEYS;
如您所见,命令使用LOAD DATA INFILE
采用纯文本值,将它们变成十六进制(两个都是十六进制的哈希时,所以...(
我听说了来自MySQL配置文件中的缓冲区大小等以及所有这些值。我应该改变什么,最好的价值观是什么?如您所见,我锁定了桌子,还可以禁用已超速加速的密钥。
我还阅读了文档:
myisamchk --keys-used=0 -rq /var/lib/mysql/dbName/tblName
在插入之前也将其加快。但是什么是tblName
?(因为我有一个.frm文件,一个.myd和一个.myi,所以我应该指出哪一个?(
这是我读过的有关优化的最后一个简短提示
编辑:忘了告诉,一切都是Localhost。
所以,我最终设法插入了我的500GB数据库,其中超过30亿个条目,例如5小时。
我尝试了多种方法,在重建Primary Index
时,我遇到了此错误ERROR 1034 (HY000): Duplicate key 1 for record at 2229897540 against new record at 533925080
。
我现在将解释如何完成插入:
- 我用
GNU CoreUtils : sort.exe
(im on Windows(对.csv
文件进行排序,请牢记这样做,您需要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;
!!!(锁定表验证写;加载数据流动的'g:\ backup.csv' 忽略表验证 由";"终止的字段 被''封闭 线终止的行 (@myhash,@myverif(set hash = unnex(@myhash(,verif = unnex(@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
操作,则将temp文件放在另一个驱动器中。(读/写速度不是同一位置的两个数据(
再次来源是在这里:信用此解决方案
我很确定它是验证,而不是verification.MYD
或其他两个。.myd是数据,.myi是索引,.frm是架构。
字符串多长时间?是十六进制吗?如果32个十六进制数字,那么您不需要BINARY(16)
即可获得UNHEX
的输出?
该过程的较长部分可能是ENABLE KEYS
,即何时构建索引。在运行时执行SHOW PROCESSLIST;
- 如果说"使用钥匙扣",请杀死它,它将需要永远。如果说诸如"通过维修构建"之类的话,那就很好 - 它正在排序,然后有效地加载索引。
您可以通过在开始过程之前设置myisam_data_pointer_size=5
来节省5GB的磁盘空间。似乎也有myisam_index_pointer_size
,但默认为5,这可能对您的情况是正确的。(我在2004年左右在VER 4.0上遇到了一次设置;但再也不会。(
我认为key_buffer_size
在加载和索引过程中不会很重要 - 因为您真的希望它不使用key_buffer。不要将其设置得太高,以至于您用完了RAM。交换是可怕的用于性能。