//最快的方法?10000記錄?23MS
創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比蚌山網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式蚌山網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋蚌山地區(qū)。費(fèi)用合理售后完善,10余年實(shí)體公司更值得信賴。
public?static?void?insert()?{??
//?開時(shí)時(shí)間??
Long?begin?=?new?Date().getTime();??
//?sql前綴??
String?prefix?=?"INSERT?INTO?tb_big_data?(count,?create_time,?random)?VALUES?";??
try?{??
//?保存sql后綴??
StringBuffer?suffix?=?new?StringBuffer();??
//?設(shè)置事務(wù)為非自動(dòng)提交??
conn.setAutoCommit(false);??
//?Statement?st?=?conn.createStatement();??
//?比起st,pst會(huì)更好些??
PreparedStatement?pst?=?conn.prepareStatement("");??
//?外層循環(huán),總提交事務(wù)次數(shù)??
for?(int?i?=?1;?i?=?100;?i++)?{??
//?第次提交步長(zhǎng)??
for?(int?j?=?1;?j?=?10000;?j++)?{??
//?構(gòu)建sql后綴??
suffix.append("("?+?j?*?i?+?",?SYSDATE(),?"?+?i?*?j??
*?Math.random()?+?"),");??
}??
//?構(gòu)建完整sql??
String?sql?=?prefix?+?suffix.substring(0,?suffix.length()?-?1);??
//?添加執(zhí)行sql??
pst.addBatch(sql);??
//?執(zhí)行操作??
pst.executeBatch();??
//?提交事務(wù)??
conn.commit();??
//?清空上一次添加的數(shù)據(jù)??
suffix?=?new?StringBuffer();??
}??
//?頭等連接??
pst.close();??
conn.close();??
}?catch?(SQLException?e)?{??
e.printStackTrace();??
}??
//?結(jié)束時(shí)間??
Long?end?=?new?Date().getTime();??
//?耗時(shí)??
System.out.println("cast?:?"?+?(end?-?begin)?/?1000?+?"?ms");??
}
建緩沖區(qū)。比如其他類型的高速緩存(redis等)作為中間緩沖層。
數(shù)據(jù)的查詢,更改首先在這個(gè)層處理,處理完再更新到對(duì)應(yīng)的數(shù)據(jù)庫(kù)。
注意額外增加鎖,或者緩存機(jī)制防止緩存擊穿,雪崩導(dǎo)致系統(tǒng)崩潰。
我們經(jīng)常會(huì)遇到操作一張大表,發(fā)現(xiàn)操作時(shí)間過(guò)長(zhǎng)或影響在線業(yè)務(wù)了,想要回退大表操作的場(chǎng)景。在我們停止大表操作之后,等待回滾是一個(gè)很漫長(zhǎng)的過(guò)程,盡管你可能對(duì)知道一些縮短時(shí)間的方法,處于對(duì)生產(chǎn)環(huán)境數(shù)據(jù)完整性的敬畏,也會(huì)選擇不做介入。最終選擇不作為的原因大多源于對(duì)操作影響的不確定性。實(shí)踐出真知,下面針對(duì)兩種主要提升事務(wù)回滾速度的方式進(jìn)行驗(yàn)證,一種是提升操作可用內(nèi)存空間,一種是通過(guò)停實(shí)例,禁用 redo 回滾方式進(jìn)行進(jìn)行驗(yàn)證。
仔細(xì)閱讀過(guò)官方手冊(cè)的同學(xué),一定留意到了對(duì)于提升大事務(wù)回滾效率,官方提供了兩種方法:一是增加 innodb_buffer_pool_size 參數(shù)大小,二是合理利用 innodb_force_recovery=3 參數(shù),跳過(guò)事務(wù)回滾過(guò)程。第一種方式比較溫和,innodb_buffer_pool_size 參數(shù)是可以動(dòng)態(tài)調(diào)整的,可行性也較高。第二種方式相較之下較暴力,但效果較好。
兩種方式各有自己的優(yōu)點(diǎn),第一種方式對(duì)線上業(yè)務(wù)系統(tǒng)影響較小,不會(huì)中斷在線業(yè)務(wù)。第二種方式效果更顯著,會(huì)短暫影響業(yè)務(wù)連續(xù),回滾所有沒有提交的事務(wù)。
1.用start transaction關(guān)閉mysql的自動(dòng)提交,合理設(shè)置插入批量大小,不要一條數(shù)據(jù)提交一次。
2.修改表的存儲(chǔ)引擎InnoDB為MyISAM。(因?yàn)镮nnoDB中存在redo log日志,每次更新表的結(jié)果先寫入redo log中,等redo log滿了之后再寫入磁盤而這個(gè)過(guò)程是會(huì)停止其他所有的事務(wù))
3.優(yōu)化SQL(一條SQL語(yǔ)句插入多條數(shù)據(jù))
4.盡量順序插入(存儲(chǔ)引擎底層采用的數(shù)據(jù)結(jié)構(gòu)是B+tree索引,如果每次插入記錄都在索引的最后面,索引的定位效率很高,并且對(duì)索引調(diào)整較小;如果插入的記錄在索引中間,則需要維護(hù)B+tree并且索引定位效率會(huì)下降,數(shù)據(jù)量較大時(shí)會(huì)有頻繁的磁盤操作)