当前位置: 首页 > 后端技术 > Java

线上sql执行慢,分享3个优化案例

时间:2023-04-01 22:09:22 Java

鍓嶆鏃堕棿鍗氫富绾夸笂椤圭洰鐨勫嚑涓悗鍙版帴鍙f墽琛屾椂闂撮兘鍦ㄤ笁鍥涚浠ヤ笂銆傛煡鐪嬫帴鍙d唬鐮侊紝鍙戠幇sql璇彞鎵ц澶參銆備簬鏄紑濮嬪垎鏋恠ql鐨勬墽琛岋紝鎶婃瘮杈冪粡鍏哥殑浼樺寲妗堜緥鍒嗕韩鍒拌繖閲屻€傛湰鏂囦粙缁嶇殑MySql8.0+浠g爜婕旂ず鍦板潃锛歨ttps://github.com/wayn111/newbee-mall-pro鍗氫富github鍦板潃锛歨ttps://github.com/wayn111娆㈣繋澶у鍏虫敞锛屾槦涓€锛屾垨鑰卶uery鏉′欢閿欒绾夸笂鏈夌涓夋柟璐﹀彿鎵爜缁戝畾鎵嬫満鍙风櫥褰曠殑鎺ュ彛锛岃鎺ュ彛姝e父閫昏緫濡備笅锛氫娇鐢ㄨ嫻鏋溿€丵Q銆佸井淇℃壂鎻忓鎴风浜岀淮鐮佺櫥褰曪紝鑾峰彇鐢ㄦ埛绗笁鏂硅处鍙风殑鍞竴ID銆傚垽鏂敤鎴疯〃涓槸鍚﹀瓨鍦ㄧ涓夋柟璐﹀彿ID锛屽鏋滃瓨鍦ㄤ笖宸茬粦瀹氭墜鏈哄彿锛屽垯鐩存帴杩斿洖鐢ㄦ埛token杩涜鐧诲綍鎿嶄綔銆傚鏋滀笉瀛樺湪锛屽皢鎻愮ず鐢ㄦ埛缁戝畾鎵嬫満鍙枫€傜敤鎴峰~鍐欐墜鏈哄彿鍜岀煭淇¢獙璇佺爜鍚庯紝绗笁鏂硅处鍙峰敮涓€ID涓庢墜鏈哄彿缁戝畾锛屾垚鍔熻繑鍥炵敤鎴穞oken杩涜鐧诲綍鎿嶄綔銆傚崥涓昏寰楄繖涓帴鍙f槸10鏈?1鍙蜂笂绾跨殑锛屽埌鐜板湪宸茬粡涓€骞村浜嗭紝鎺ュ彛鐨勬墽琛屾椂闂磋秺鏉ヨ秺鎱€傚垵姝ュ垎鏋愶紝鐢ㄦ埛鏁伴噺鎸佺画澧為暱锛岀敤鎴疯〃璁板綍涓嶆柇澧炲姞锛屽鑷碨QL鏌ヨ銆傛墽琛屾晥鐜囪秺鏉ヨ秺浣庛€傝繖閲屼互vc_member_bak涓轰緥锛岃〃缁撴瀯鍜屾暟鎹睍绀猴紝鍏朵腑apple_id銆亀eixn_id銆乹q_id閮芥湁绱㈠紩锛歷c_member_bak琛ㄦ暟鎹噺绾?6涓囨潯銆傛墦寮€鏃ュ織鍒嗘瀽鍚庡彂鐜版墽琛屽涓婼QL澶參浜嗭細SELECT*FROMvc_memberWHEREqq_id='xxx'ORapp_id='xxx'ORweixin_id='xxx';鎵ц缁撴灉锛氬ぇ绾﹂渶瑕?.3绉掞紝杩欐槸鏈湴妯℃嫙鐨勬暟鎹紝鍦ㄧ嚎鐢ㄦ埛鍦ㄧ櫨涓囩骇鍒紝鑰楁椂杈惧埌浜?銆?绉掞紝浜庢槸鍗氫富寮€濮嬭瑙e垎鏋恠ql鎵ц锛歟xplain缁撴灉涓殑key鍒椾负绌猴紝鍙互鐪嬪嚭铏界劧possible_keys鍒楁槸鏈夊€肩殑锛屼絾鏄墽琛岃繃绋嬩腑娌℃湁浣跨敤绱㈠紩瀵艰嚧鍏ㄨ〃鏌ヨ锛宺ows鍒椾负46鍙互鐪嬪嚭鍩烘湰鎺ヨ繎鍏ㄨ〃鏌ヨ銆傞偅涔堥棶棰樻槸浠€涔堬紵apple_id銆亀eixn_id銆乹q_id杩欎笁涓瓧娈垫垜浠笉鏄凡缁忓姞浜嗙储寮曚簡鍚楋紵浜庢槸鍗氫富浠旂粏鏌ヨ浜嗕竴涓媠ql璇彞锛屽彂鐜伴噷闈㈡湁涓潙銆傛煡璇㈢殑where鏉′欢鐢ㄥ埌鐨勪笁涓潯浠跺瓧娈垫槸app_id銆亀eixin_id銆乹q_id锛屾垜浠殑绱㈠紩瀛楁鏄痑pple_id銆亀eixn_id銆乹q_id銆傛樉鐒讹紝杩欐槸鏌ヨ瀛楁銆俛pple_id鍐欐垚app_id銆俛pp_id娌℃湁绱㈠紩锛屾墍浠ュ湪or鏉′欢鏌ヨ涓嬭繘琛屽叏琛ㄦ壂鎻忋€備慨鏀瑰瓧娈靛悗鎵ц缁撴灉锛歰k锛屽彂鐜版煡璇㈠瓧娈靛啓閿欎簡锛屾墍浠ヤ慨鏀规煡璇㈠瓧娈垫纭悗锛?.18绉掑悗鏌ヨ姝e父銆傪煒?銆俇pdate鎵归噺鏇存柊浼樺寲鍗氫富涔嬪墠鐨勭嚎涓婇」鐩紙SpringBoot+Mybatis锛夋湁涓€涓帴鍙i渶瑕佹壒閲忔洿鏂板簱瀛樸€傚綋鏃跺崥涓诲喅瀹氬湪xml鏂囦欢涓娇鐢紝鍥犱负鏃犳硶鍦╢or寰幆鐨勪唬鐮佷腑鎵ц鏇存柊閫昏緫銆俧oreach鏍囩鎵ц鎵归噺鏇存柊閫昏緫锛屽涓嬫墍绀猴細{stockNumDTO.goodsId}鍜宻tock_num>=#{stockNumDTO.goodsCount}鍜実oods_sell_status=0锛?/foreach>鍙锛岃繖鏉℃洿鏂皊ql鏈川涓婃槸鍦ㄤ竴鏉ql涓墽琛屽鏉℃洿鏂拌鍙ャ€傝繖绉嶅啓娉曡櫧鐒舵病鏈夊湪浠g爜鐨刦or寰幆涓墽琛岋紝浣嗘槸鍦ㄦ墽琛岃繖鏉ql璇彞鐨勬椂鍊欙紝MySql杩樻槸鍗曠嫭鎵ц鐨勩€傝繖閲屾垜浠互tb_newbee_mall_goods_info琛ㄤ负渚嬨€傝〃缁撴瀯鏄剧ず锛氬悓鏃舵墽琛屼簡3鏉pdate璇彞锛岀粨鏋滃涓嬶細濡備笂锛屽鏋滃叾涓竴鏉pdate璇彞鑰楁椂40姣锛岄偅涔堝綋鏈?00鏉pdate璇彞鏃讹紝鐣岄潰鑰楁椂4绉掞紝杩欐樉鐒舵槸涓嶈兘鎺ュ彈鐨勩€傛湁娌℃湁鏇撮珮绾х殑鍐欐硶鏉ユ墽琛寀pdate鎵归噺鏇存柊锛熷綋鐒舵湁銆傚崥涓诲悗鏉ヤ娇鐢╱pdate+case璇彞瀹屾垚浜嗚繖涓壒閲忔洿鏂扮殑鍔熻兘銆傛洿鏂?casesql濡備笅锛歎PDATEtb_newbee_mall_goods_infoSETstock_num=CASEgoods_idWHEN10003THENstock_num-1WHEN10004THENstock_num-1WHEN10005THEN1stock_ELSEstock_numENDWHEREgoods_idIN(10003,10004,10005stock)鎴戜滑浣跨敤casegoods_idwhen10004thenstock_num-1...ELSEstock_numEND鏉′欢灏唃oods_id瀵瑰簲璁板綍鐨勫簱瀛樻暟閲忚缃负鎴戜滑鎯宠鐨勭粨鏋溿€侾S锛氶渶瑕佹敞鎰忕殑鏄紝casewhenthen璇彞涓嶅尮閰嶆椂锛屼細杩斿洖null锛屼細瀵艰嚧涓嶅尮閰嶇殑搴撳瓨鏇存柊涓簄ull銆傚洜姝わ紝蹇呴』鍖呭惈ELSEstock_numEND鏉′欢銆傚綋鏉′欢涓嶅尮閰嶆椂锛屽簱瀛樻暟閲忚缃负鍘熷鏁伴噺銆傝繖閲寃here鏉′欢鍏跺疄鍙互鐪佺暐銆傚叾浣滅敤鏄檺鍒舵洿鏂拌寖鍥达紝浣嗗缓璁姞涓婏紝閬垮厤sql鍐欓敊鏃惰剰鏁版嵁鑼冨洿杩囧ぇ銆傛洿鏂?妗堜緥鎵ц缁撴灉锛氬彲浠ョ湅鍑烘垜浠洿鏂颁簡3鏉¤褰曪紝鑰楁椂50姣锛屾洿鏂扮殑璁板綍瓒婂浼樺寲鏁堟灉瓒婃槑鏄俱€?.澶氱嚎绋嬩紭鍖栧ぇ鏁版嵁鎻掑叆閫熷害鍗氫富绾夸笂鏈塁DK鍏戞崲鐮佹湇鍔°€傚綋鎿嶄綔鍦ㄥ悗鍙板垱寤轰竴鎵笴DK浠g爜鏃讹紝绯荤粺浼氬皢浠g爜鎻掑叆鏁版嵁搴撳苟淇濆瓨锛屼互淇濊瘉鐢ㄦ埛鍏戞崲CDK鏃讹紝浠g爜鍙湁鍦ㄦ暟鎹簱瀛樺湪鐨勬儏鍐典笅鎵嶈兘鍏戞崲锛屼繚璇佸畨鍏?褰撴搷浣滃垱寤?00,000鏉DK璁板綍鏃讹紝鍦ㄧ嚎鏃堕棿闇€瑕佸崄鍑犵銆傝繖閲屾垜浠互cdk_info琛ㄤ负渚嬶紝琛ㄧ粨鏋勫涓嬶細濡傛灉鐜板湪闇€瑕佷繚瀛?0涓囨潯cdk_info璁板綍锛屾壒閲忎繚瀛樹唬鐮佸涓嬶細/***cdkcreation*/@TestpublicvoidcdkCreate(){鏁存暟=100000;Listlist=newArrayList<>(num);鏃ユ湡date=newDate();StringcreateUser="娴嬭瘯";for(Integeri=0;icdkInfos:ListUtil.partition(list,1000)){flag=cdkInfoService.saveBatch(cdkInfos,cdkInfos.size());濡傛灉锛堬紒鏍囧織锛墈鎵撶牬;}}longend=System.currentTimeMillis();log.info("鎵ц鏃堕棿锛?+(end-begin)+"ms");Assert.isTrue(flag,"鎵归噺鏇存柊澶辫触");}鎵ц鏃堕棿锛氬彲浠ョ湅鍒板湪鍗曠嚎绋嬩笅锛屾彃鍏?0涓囨潯璁板綍澶ф闇€瑕?5绉掞紝鑰屼笖杩?0涓囨潯鏁版嵁娌℃湁鍏宠仈锛屼笉褰卞搷褰兼銆傜劧鍚庢垜浠彲浠ラ€氳繃绾跨▼姹犳彁浜ゅ崟鎵规鐨勪繚瀛樹换鍔°€傞厤鍚圕ompletableFuture.allOf(futures.toArray(newCompletableFuture[0])).join()鏂规硶锛岀瓑寰呮墍鏈変换鍔℃墽琛屽畬姣曪紝寰楀埌缁撴灉浠g爜濡備笅锛?***閫氳繃绾跨▼姹犲垱寤篶dk*/@TestpublicvoidasyncCdkCreate(){intnum=100000;Listlist=newArrayList<>(num);鏃ユ湡date=newDate();StringcreateUser="娴嬭瘯";for(Integeri=0;i();List>futures=newArrayList<>();for(ListcdkInfos:ListUtil.partition(list,1000)){CompletableFuturefuture=CompletableFuture.runAsync(()->{booleanb=cdkInfoService.saveBatch(cdkInfos,cdkInfos.size());flagList.add(b);},ForkJoinPool.commonPool());futures.add锛堟湭鏉ワ級锛泒CompletableFuture.allOf(futures.toArray(newCompletableFuture[0])).join();闀跨=System.currentTimeMillis();log.info("鎵ц鏃堕棿锛?+(end-begin)+"ms");Assert.isTrue(flagList.stream().filter(aBoolean->!aBoolean).findFirst().orElse(true),"鎵归噺鏇存柊澶辫触");}鎵ц鏃堕棿锛氬彲浠ョ湅鍒版墽琛岃€楁椂2.5绉掞紝鎵ц鏃堕棿缂╃煭浜?鍊嶃€傝繖閲屾€荤粨涓€涓嬶紝鏈枃鍒嗕韩鐨?涓紭鍖栨渚嬪凡缁忎粙缁嶅畬姣曘€傚笇鏈涘澶у鐨勬棩甯稿紑鍙戞湁鎵€甯姪銆傚枩娆㈢殑鏈嬪弸鍙互鐐硅禐鍏虫敞鍝︷煒樸€?/p>