Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
负载数据填充的MySQL优化_Mysql_Optimization_Myisam_Load Data Infile - Fatal编程技术网

负载数据填充的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;
如您所见,命令use
LOAD 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;