1. 程式人生 > >MariaDB快速批量插入數據的幾種辦法

MariaDB快速批量插入數據的幾種辦法

bsp 數量級 存儲 磁盤 數量 引擎 創建索引 ron 通過

前言

當要向MariaDB中插入新的數據時,以下過程會影響插入所消耗的時間:(按時間消耗長短降序排序)

  • 將數據sync到磁盤上(它是事務結束的一部分)
  • 添加新的鍵值。索引越大,更新鍵值所消耗的時間就越長。
  • 檢查外鍵約束(如果存在)。
  • 將行添加到存儲引擎中。
  • 將待插入數據發送給服務器。

下面介紹幾種向表中快速插入數據的技術(按效率的提升程度降序排序)。

1. 禁用索引(key)

你可以臨時禁用非唯一索引。特別是在表中數據很少甚至沒有數據的時候,禁用非唯一索引可以極大提升插入速度。

多數存儲引擎(至少MyISAM和Aria是如此)的ENABLE KEYS會掃描表中的行並收集索引鍵值,然後對它們排序,最後創建索引塊。

因此,先禁用KEY,插入數據後啟用KEY的整體速度比每行都更新一次索引的速度至少要快一個數量級,並且所需要的buffer也更少。

註意:當使用INSERTLOAD 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

: 增大該值以允許insert語句可以一次性插入更多的行(即增加insert語句中括號的個數)

MariaDB快速批量插入數據的幾種辦法