MySQL優化插入數據速度

2020-08-08 14:48:38
在 MySQL 中,向數據表插入數據時,索引、唯一性檢查、數據大小是影響插入速度的主要因素。本節將介紹優化插入數據速度的幾種方法。

根據不同情況,可以分別進行優化。

對於 MyISAM 引擎的表,常見的優化方法如下:

1. 禁用索引

對非空表插入數據時,MySQL 會根據表的索引對插入的記錄進行排序。插入大量數據時,這些排序會降低插入數據的速度。爲了解決這種情況,可以在插入數據之前先禁用索引,等到數據都插入完畢後在開啓索引。

禁用索引的語句爲:

ALTER TABLE table_name DISABLE KEYS;

重新開啓索引的語句爲:

ALTER TABLE table_name ENABLE KEYS;

對於新建立的表,可以先不建立索引,等到數據都匯入以後再建立索引,這樣可以提高匯入數據的速度。

2. 禁用唯一性檢查

插入數據時,MySQL 會對插入的數據進行唯一性檢查。這種唯一性檢驗會降低插入數據的速度。爲了降低這種情況對查詢速度的影響,可以在插入數據前禁用唯一性檢查,等到插入數據完畢後在開啓。

禁用唯一性檢查的語句爲:

SET UNIQUE_CHECKS=0;

開啓唯一性檢查的語句爲:

SET UNIQUE_CHECKS=1;

3. 使用批次插入

在 MySQL 中,插入多條數據有 2 種方式。第一種是使用一個 INSERT 語句插入多條數據。INSERT 語句的情形如下:

INSERT INTO items(name,city,price,number,picture) VALUES ('耐克運動鞋','廣州',500,1000,'001.jpg'),('耐克運動鞋2','廣州2',500,1000,'002.jpg');


第二種是一個 INSERT 語句只插入一條數據,執行多個 INSERT 語句來插入多條數據。INSERT 語句的情形如下:

INSERT INTO items(name,city,price,number,picture)  VALUES('耐克運動鞋','廣州',500,1000,'001.jpg');
INSERT INTO items(name,city,price,number,picture)  VALUES('耐克運動鞋2','廣州',500,1000,'002.jpg');


一次性插入多條數據和多次插入數據所耗費的時間是不一樣的。第一種方式減少了與數據庫之間的連線等操作,其速度比第二種方式要快一些。所以插入大量數據時,建議使用第一種方法。

注意:如果能用 LOAD DATA INFILE 語句,就儘量用 LOAD DATA INFILE 語句。因爲 LOAD DATA INFILE 語句匯入數據的速度比 INSERT 語句的速度快。

對於 InnoDB 引擎的表,常見的優化方法如下:

1. 禁用唯一性檢查

同 MyISAM 引擎相同,插入數據之前先禁用索引,等到數據都插入完畢後在開啓索引。

2. 禁用外來鍵檢查

使用外來鍵時,在子表中插入一條數據,首先會檢查主表中是否有相應的主鍵值,然後鎖定主表的記錄,在插入值。相比較,使用外來鍵多了2步操作,速度會慢一些。

所以我們可以在插入數據之前禁止對外來鍵的檢查,數據插入完成之後再恢復對外來鍵的檢查。不多對於數據完整性要求較高的系統不建議使用。

禁用外來鍵檢查語句爲:

SET FOREIGN_KEY_CHECKS=0; 

恢復對外來鍵的檢查語句爲:

SET FOREIGN_KEY_CHECKS=1;

3. 禁止自動提交

在《MySQL設定事務自動提交》一節我們提到 MySQL 的事務自動提交模式預設是開啓的,其對 MySQL 的效能也有一定得影響。也就是說如果你插入了 1000 條數據,MySQL 就會提交 1000 次,這大大影響了插入數據的速度。而如果我們把自動提交關掉,通過程式來控制,只要一次提交就可以了。

所以插入數據之前可以先禁止事務的自動提交,待數據匯入完成之後,再恢復自動提交操作。

禁止自動提交語句爲:

SET AUTOCOMMIT=0; 

恢復自動提交語句爲:

SET AUTOCOMMIT=1;