负载数据填充的MySQL优化
我看到到处都有程序员在讨论如何优化最快的负载数据填充的MySQL优化,mysql,optimization,myisam,load-data-infile,Mysql,Optimization,Myisam,Load Data Infile,我看到到处都有程序员在讨论如何优化最快的加载数据填充插入。但他们从不解释太多他们的价值选择等,优化取决于环境和实际需要 所以,我想解释一下,在我的mysql配置文件中,为了达到尽可能快的插入速度,最好的值是什么 我的配置,一个英特尔双核@3.30GHz,4Gb DDR4 RAM(windows7说“2.16Gb可用”,因为保留了内存) 我的backup.csv文件是纯文本文件,大约有50亿个条目,因此它的文件大小为500Gb,与此模式类似(但十六进制字符串长度为64): 我的表中只有两个字段,第
加载数据填充插入。但他们从不解释太多他们的价值选择等,优化取决于环境和实际需要
所以,我想解释一下,在我的mysql配置文件中,为了达到尽可能快的插入速度,最好的值是什么
我的配置,一个英特尔双核@3.30GHz,4Gb DDR4 RAM(windows7说“2.16Gb可用”,因为保留了内存)
我的backup.csv文件是纯文本文件,大约有50亿个条目,因此它的文件大小为500Gb,与此模式类似(但十六进制字符串长度为64):
我的表中只有两个字段,第一个是唯一索引。
对于节省空间的问题,行格式设置为“固定”。出于同样的原因,字段类型被设置为二进制(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;
如您所见,命令useLOAD DATA infle
获取纯文本值,将其转换为十六进制(两者最终都是十六进制散列…)
我听说了缓冲区大小等,以及MySQL配置文件中的所有这些值。我应该改变什么,请问什么是最好的价值观?
正如你所看到的,我已经锁定了表,并禁用了加速键
我还阅读了有关文件:
myisamchk --keys-used=0 -rq /var/lib/mysql/dbName/tblName
在插入之前这样做也会加快速度。但真正的tblName
是什么?(因为我有一个.frm文件,一个.MYD和一个.MYI,所以我应该指向哪一个?)
编辑:忘了说了,一切都是本地主机。我很确定这是验证,而不是验证。MYD
或其他两个。MYD是数据,.MYI是索引,.frm是模式
绳子有多长?你是十六进制的吗?如果是32位十六进制数字,那么您不想将二进制(16)
用于UNHEX
的输出吗
在构建索引时,该过程的较长部分可能是启用键
。不要显示进程列表代码>当它运行时——如果它说“使用keybuffer”,杀死它,它将花费永远的时间。如果它说的是“修复构建”,那么它很好——它是排序,然后高效地加载索引
启动进程之前,通过设置myisam\u data\u pointer\u size=5,可以节省5GB的磁盘空间。似乎还有myisam\u index\u pointer\u size
,但它可能默认为5,这对于您的情况可能是正确的。(大约在2004年,我在4.0版上遇到过一次这样的设置,但再也没有遇到过。)
我不认为key\u buffer\u size
在加载和索引过程中会起作用,因为您确实希望它不使用key\u buffer。不要把它设置得太高,以致内存不足。交换对性能来说很糟糕。因此,我最终设法在大约5个小时内插入了包含30多亿条目的500GB数据库
我尝试了许多方法,在重建主索引时,我遇到了这个错误错误1034(HY000):在2229897540处复制记录键1,而在533925080处复制新记录
现在我将解释我是如何完成插入的:
- 我用GNU CoreUtils:sort.exe对我的
.csv
文件进行了排序(windows上的im)。记住,要这样做,您需要1.5倍的csv文件作为可用空间,用于临时文件。(因此,将.csv文件计算在内,最终是它的2.5倍)
- 您可以创建包含索引和所有内容的表
- 执行
mysqladmin刷新表-u a_db_user-p
- Execute
myisamchk--keys used=0-rq/var/lib/mysql/dbName/tblName
- 插入数据:(不要使用
ALTER TABLE tblname DISABLE KEYS;
!!!)
锁表验证写入;
加载数据填充'G:\\backup.csv'
忽略进入表验证
以“;”结尾的字段
附以“.”
以“\r\n”结尾的行
(@myhash,@myverif)SET hash=UNHEX(@myhash),verif=UNHEX(@myverif);
解锁表格
- 插入数据时,通过执行myisamchk--key\u buffer\u size=1024M--sort\u buffer\u size=1024M-rqq/var/lib/mysql/dbName/tblName来重建索引
(请注意,
-rqq
,将q
加倍将忽略可能的重复错误,尝试修复它们(而不是在等待数小时后停止插入!)
- 执行
mysqladmin刷新表-u a_db_user-p
我完了
- 我注意到,如果
.csv
文件位于数据库以外的另一个驱动器上,那么速度会大大提高。对于排序操作,请将临时文件置于另一个驱动器中。(由于两个数据不在同一位置,所以读/写速度会大大提高)
这一点的来源再次出现在这里:我绝对没有名为验证的文件
,无论如何我都会尝试,可能myisamchk
是独自完成这项工作的。数据是十六进制字符串是的,64长度(所以是二进制的;我忘了在我的问题上提到这一点)。我的版本是mysql.exe版本14.14发行版5.1.41,适用于Win32(ia32)
噢,对于myisam\u数据\u指针大小
,它的默认值为6
,所以它很好,因为5
刚好不到50亿。老实说,有一个500Gb的数据库,我不会为5Gb而奋斗好像我没有<代码> MysasMyDexxPoTimeSyth[< /Cord>注册]。您可能有3个文件:代码>验证。Myd < /代码>等。64/32。5.1是过时的;考虑升级。<代码> 6(代码,256TB限制)和<代码> 5 < /代码>(1TB限制)是“数据指针”中的字节数。“在文件中。4
(4GB限制)将太小。谢谢。我尝试直接键入myisamchk--keys used=0-rq mypath/verification
,看起来mysql正在独自完成这项工作。我升级了
myisamchk --keys-used=0 -rq /var/lib/mysql/dbName/tblName
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;