mysql - 請(qǐng)問有innodb 引擎的表導(dǎo)入900w 的數(shù)據(jù),用了快9個(gè)小時(shí)。有什么快速的方法嗎。正常是多少小時(shí)一般。
問題描述
1.導(dǎo)入備份的數(shù)據(jù)到表中,表是innodb引擎,900w多條,導(dǎo)入時(shí)用了將近9小時(shí)2.下面是sh腳本代碼片段
`$MYSQL -u$dbUser -h$dbHost -p$dbPassword --default-character-set=utf8 $dbName < $mysqlImportFile`
3.問題: 1)時(shí)間是否正常導(dǎo)了這么長時(shí)間 2)有沒有更快速的方法 3)網(wǎng)上找的方法是先關(guān)閉事務(wù)
SET autocommit=0; 在腳本里應(yīng)該如何寫呢?
問題解答
回答1:1、索引可以先去掉,導(dǎo)完了再加上。2、把binlog關(guān)了。(減少寫磁盤)3、buffer_pool能調(diào)多大調(diào)多大。(減少寫磁盤)4、redo_log大小能多大多大(減少checkpoint)5、flush neighbors打開(增加順序?qū)懘疟P)6、flush_at_trx_commit=0(減少寫磁盤)7、5.7可以直接像拷貝myisam表一樣拷貝ibd,不知道會(huì)不會(huì)快(沒過做比較)
回答2:修改/etc/my.cnf配置添加autocommit=0; 注釋掉log-bin=mysql-bin(暫時(shí)不沒有主從配置需求)導(dǎo)入速度果然快了很多
注意導(dǎo)入后刪除掉autocommit=0;不然修改表的操作會(huì)不能執(zhí)行,必須手動(dòng)提交才可以。
回答3:開啟事務(wù)批量導(dǎo)入,速度是很快的,我在Ubuntu(i5-3230M)上PHP平均每秒能插入超過5000條記錄到5.6,也就是導(dǎo)入900萬數(shù)據(jù)估計(jì)只需 9000000/5000/60 = 30分鐘.需要注意的是,MySQL InnoDB里,每個(gè)寫操作比如INSERT/UPDATE/DELETE等都會(huì)被當(dāng)做一個(gè)事務(wù)自動(dòng)提交.所以需要先SET AUTOCOMMIT=0禁掉自動(dòng)提交后再START TRANSACTION開啟事務(wù),最后手動(dòng)COMMIT提交.
另外,減少寫日志操作也能加快寫入性能:禁用 log-bin 二進(jìn)制日志.禁用 general_log 審計(jì)日志.innodb_flush_log_at_trx_commit 設(shè)為0,禁止每次提交事務(wù)都寫入日志.加大 innodb_buffer_pool_size.
