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