MariaDB快速批量插入數據的幾種辦法
前言
當要向MariaDB中插入新的數據時,以下過程會影響插入所消耗的時間:(按時間消耗長短降序排序)
- 將數據sync到磁盤上(它是事務結束的一部分)
- 添加新的鍵值。索引越大,更新鍵值所消耗的時間就越長。
- 檢查外鍵約束(如果存在)。
- 將行添加到存儲引擎中。
- 將待插入數據發送給服務器。
下面介紹幾種向表中快速插入數據的技術(按效率的提升程度降序排序)。
1. 禁用索引(key)
你可以臨時禁用非唯一索引。特別是在表中數據很少甚至沒有數據的時候,禁用非唯一索引可以極大提升插入速度。
多數存儲引擎(至少MyISAM和Aria是如此)的ENABLE KEYS
會掃描表中的行並收集索引鍵值,然後對它們排序,最後創建索引塊。
因此,先禁用KEY,插入數據後啟用KEY的整體速度比每行都更新一次索引的速度至少要快一個數量級,並且所需要的buffer也更少。
註意:當使用INSERT
或 LOAD DATA
向空表中插入數據時,MariaDB會自動先DISABLE KEYS
,插入成功後再自動ENABLE KEYS
。
當插入海量數據時,花在完整性檢查上的時間也會很長。可以通過禁用UNIQUE
索引以及刪除主外鍵約束節省時間;
此外,如果表上有INSERT觸發器,或者PERSISTENT
字段,可以先刪除它們,在數據插入完成之後再重建它們。
2. 使用INSERT語句插入數據
2.1 使用事務
當需要使用單行insert語句(一次插入一行)插入數據時,可以將它們放進事務中,從而避免每行一次事務(意味著每行都需要將數據sync到磁盤)。
例如,每個事務中包含1000次insert,這至少提升1000倍插入效率。
2.2 insert語句的多值插入
你可以使用insert語句一次性插入多行數據,例如:
INSERT INTO table_name values(1,"row 1"),(2, "row 2"),...;
系統變量max_allowed_packet
控制了該語句允許的最大行數量。
3. 可以優化插入速度的服務器變量
innodb_buffer_pool_size:如果你的InnoDB/XtraDB表中有多個索引,可增大該值
key_buffer_size:如果你的MyISAM表中有多個索引,可增大該值
max_allowed_packet
MariaDB快速批量插入數據的幾種辦法