Mysql中Innodb大量插入数据时SQL语句的优化
?
innodb優化后,29小時入庫1300萬條數據
參考:http://blog.51yip.com/mysql/1369.html
?
對于Myisam類型的表,可以通過以下方式快速的導入大量的數據:
ALTER TABLE tblname DISABLE KEYS;
? ? loading the data
? ? ALTER TABLE tblname ENABLE KEYS;
這兩個命令用來打開或者關閉Myisam表非唯一索引的更新。在導入大量的數據到一個非空的Myisam表時,通過設置這兩個命令,可以提高導入的效率。對于導入大量數據到一個空的Myisam表,默認就是先導入數據然后才創建索引的,所以不用進行設置。
?
?
DISABLE KEYS 和ENABLE KEYS 用來打開或關閉MyISAM表非唯一索引的更新,可以提高速度,注意:對InnoDB表無效。
?
加載大量數據時,關閉非唯一索引,取消唯一性檢查,以及取消自動提交以提高插入速度
set unique_checks=0 alter table stu disable keys set autocommit=0 load load infile........ alter table stu enable keys set unique_checks=1 set autocommit =1?
?
沒有使用打開或關閉MyISAM表非唯一索引:
mysql> load data infile ‘/home/mysql/film_test.txt’into table film_test2 fields terminated by “,”;
Query OK,529056 rows affected (1 min 55.12 sec)
Records:529056 Deleted:0 Skipped:0 Warnings:0
使用打開或關閉MyISAM表非唯一索引:
mysql> alter table film_test2 disable keys;
Query OK,0 rows affected (0.0 sec)
mysql> load data infile ‘/home/mysql/film_test.txt’into table film_test2;
Query OK,529056 rows affected (6.34 sec)
Records:529056 Deleted:0 Skipped:0 Warnings:0
mysql> alter table film_test2 enable keys;
Query OK,0 rows affected (12.25 sec)
以上對MyISAM表的數據導入,但對于InnoDB表并不能提高導入數據的效率
?
?
對于Innodb類型的表,我們有以下幾種方式可以提高導入的效率:
?
- 因為Innodb類型的表是按照主鍵的順序保存的,所以將導入的數據按照主鍵的順序排列,可以有效的提高導入數據的效率。如果Innodb表沒有主鍵,那么系統會默認創建一個內部列作為主鍵,所以如果可以給表創建一個主鍵,將可以利用這個優勢提高導入數據的效率。
- 在導入數據前執行SET UNIQUE_CHECKS=0,關閉唯一性校驗,在導入結束后執行SET UNIQUE_CHECKS=1,恢復唯一性校驗,可以提高導入的效率。
- 如果應用使用自動提交的方式,建議在導入前執行SET AUTOCOMMIT=0,關閉自動提交,導入結束后再執行SET AUTOCOMMIT=1,打開自動提交,也可以提高導入的效率。
因為InnoDB表的按照主鍵順序保存的,所以將導入的數據主鍵的順序排列,可以有效地提高導入數據的效率。
使用test3.txt文本是按表film_test4主鍵存儲順序保存的
mysql> load data infile ‘/home/mysql/film_test3.txt’into table film_test4;
Query OK, 1587168 rows affected (22.92 sec)
Records:1587168 Deleted:0 Skipped:0 Warnings:0
使用test3.txt沒有任何順序的文本(效率慢了1.12倍)
mysql> load data infile ‘/home/mysql/film_test4.txt’into table film_test4;
Query OK, 1587168 rows affected (31.16 sec)
Records:1587168 Deleted:0 Skipped:0 Warnings:0
?
關閉唯一性效驗可以提高導入效率
?
在導入數據前先執行set unique_checks=0,關閉唯一性效驗,在導入結束后執行set unique_checks=1,恢復唯一性效驗,可以提高導入效率。
?
當unique_checks=1時
mysql> load data infile ‘/home/mysql/film_test3.txt’into table film_test4;
Query OK,1587168 rows affected (22.92 sec)
Records:1587168 Deleted:0 Skipped:0 Warnings:0
當unique_checks=0時
mysql> load data infile ‘/home/mysql/film_test3.txt’into table film_test4;
Query OK,1587168 rows affected (19.92 sec)
Records:1587168 Deleted:0 Skipped:0 Warnings:0
?
關閉自動提交可以提高導入效率
在導入數據前先執行set autocommit=0,關閉自動提交事務,在導入結束后執行set autocommit=1,恢復自動提交,可以提高導入效率。
當autocommit=1時
mysql> load data infile ‘/home/mysql/film_test3.txt’into table film_test4;
Query OK,1587168 rows affected (22.92 sec)
Records:1587168 Deleted:0 Skipped:0 Warnings:0
當autocommit=0時
mysql> load data infile ‘/home/mysql/film_test3.txt’into table film_test4;
Query OK,1587168 rows affected (20.87 sec)
Records:1587168 Deleted:0 Skipped:0 Warnings:0
?
知識點的補充:20160318
這里主要是針對innodb的優化
?
1,自動提交對innodb的影響非常大的,這個我做過測試,請參考,mysql autocommit對myisam,innodb的性能影響.
2,innodb_flush_log_at_trx_commit我把它設置成0,我只要求速度最快,最是統計推廣的彈窗,
這些數據只是為了我們后期統計和分析用的,沒有太大的價值。如果數據很重要就不要設置成0了。
0代表日志只大約每秒寫入日志文件并且日志文件刷新到磁盤.
1InnoDB會在每次提交后刷新(fsync)事務日志到磁盤上
2代表日志寫入日志文件在每次提交后,但是日志文件只有大約每秒才會刷新到磁盤上.
3,還有一點就是我用了mysql event功能,根linux的crontab差不多。
這里對:mysql event的補充?? --- http://www.cnblogs.com/end/archive/2011/04/21/2023725.html
總結
以上是生活随笔為你收集整理的Mysql中Innodb大量插入数据时SQL语句的优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OC基础--成员变量的封装
- 下一篇: Redis集群明细文档(转)