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