一、MySQL批量插入數據為什么比逐個插入效率高
數據庫的一個插入動作,包含了連接,傳輸,執行,提交/回滾 等等的動作,在 執行的時候可能還會遇到鎖表,等待等等,所以,批量插比逐個插效率高,是大部分情況,而不是絕對情況。
大部分情況下,批量插和逐個插,在執行層面,耗時接近;而不用多次連接數據庫,在數據傳輸層面,也是一次性傳輸效率高(網絡傳輸和這個模型類似,也有很多前置后置過程),而提交,也是只發起了一次,因而顯得效率高。
在特殊情況下,比如插入的數據是業務表,每行的數據量較大,且該表訪問頻繁,那么,插入1條的時候可能不會鎖表,而插入10000行的時候,會遇到鎖表的情況。如果并發插入,甚至發生死鎖。這個時候,就要根據經驗分析,調整每個批次的量,以避免影響使用。
舉個例子:
begin:
insert into ( (‘a’) , (‘b’) …);
commit;
這樣批量提交和
insert into(‘a’) ;
insert into (‘b’);
看上去也不需要多久,你看看非編譯型的語言php,js幾乎都不需要多久,你10w行sql對應其他代碼的parser,你想想一個10wjs需要編譯很久嗎?也不需要很久。
延伸閱讀:
二、什么是Memory引擎
Memory引擎是Mysql的內存引擎,在實現上,Memory存儲引擎不同于Innodb這種組織索引結構(索引即是數據,即數據存放在主鍵索引上),而是將索引和數據分開存儲。索引采用Hash的形式,存放主鍵id和指向數據的指針,而數據則按插入順序存放。我們稱這種數據組織方式為堆組織方式。