######業務儘可能用sql實現(縮短後臺響應時間):最近都在優化之前的程式碼:發現每個模組的index頁都需要優化(很多都在迴圈裡操作資料庫:菜!初級!)
阿新 • • 發佈:2018-12-10
###最近都在優化之前的程式碼:
發現每個模組的index頁都需要優化(很多都再迴圈裡操作資料庫:菜!初級!或者說趕專案沒想優化這回事吧)
===》解耦合前提下,能用一條SQL解決的,多測試寫SQL。可以減少很多程式碼。
希望我在疲憊,腦子不好使時候也能堅持吧。(注意休息,保持腦子好使!哈哈)
===》兩次版本:
程式碼:
/** * 版本2: * 媒體列表 顯示優化。一條SQL。減少請求響應時間。 * 定義一個VOMap。 * */ @Override public List<MediaVO> selectAll() { //列表頁:VO。====新建媒體,選擇 incomWay,模仿User選 Role。 List<MediaVO> mediaVOList = ccMediaDOMapper.selectAll(); //推廣渠道:字典表,SQL return mediaVOList; } /* // 版本一:(背景:需求變動:新增需求:媒體要顯示:媒體下廣告位數目。) // 為了省事。沒有考慮效率。直接遍歷List<mediaDO>根據mediaId查詢廣告位數目。 // 迴圈裡操作資料庫。導致響應請求很慢。。。 @Override public List<MediaVO> selectAll() { //列表頁:VO。====新建媒體,選擇 incomWay,模仿User選 Role。 List<MediaDTO> mediaDTOList = ccMediaDOMapper.selectAll(); //推廣渠道:字典表,SQL ArrayList<MediaVO> mediaVOList = new ArrayList<>(); ArrayList<Integer> mediaIdList = new ArrayList<>(); for (MediaDTO mediaDTO:mediaDTOList) { MediaVO mediaVO = new MediaVO(); //===========屬性賦值: DozerBeanMapper dozer = new DozerBeanMapper(); dozer.map(mediaDTO, mediaVO);//取代手動set。 mediaVOList.add(mediaVO);//====》VO沒有slotCount屬性值。 Integer mediaDTOId = mediaDTO.getId(); mediaIdList.add(mediaDTOId); } // ArrayList<MediaVO> slotCountList = ccAdslotDOMapper.getSlotCountListByMediaIdList(mediaIdList); List<Map<String,Integer > > slotCountMapList = ccAdslotDOMapper.getSlotCountListByMediaIdList(mediaIdList); for(int i = 0;i<slotCountMapList.size();i++){ Map<String,Integer > slotCountMapThis = slotCountMapList.get(i); Integer mediaIdmap = slotCountMapThis.get("mediaId"); Integer slotCount = slotCountMapThis.get("slotCount"); for(int j = 0;j<mediaDTOList.size();j++) { // if (mediaIdmap.intValue() == ){ 判斷匹配。效率低。首先用SQL。。。slotCountMapList // // } } } return mediaVOList; } */
SQL:之前版本就是簡單關聯使用者表。基本上就是查詢media基本資訊的SQL難度級別。
<select id="selectAll" resultMap="MediaVOMAP"> /** 別指望一次寫出來:腦子線上,反覆嘗試。才寫出來的這個SQL。腦子不線上,乾脆去休息。 */ SELECT result_media.*, COUNT(result_media.slotId) adslot_amount, u1.login_name creator_name, u2.login_name updater_name FROM ( SELECT -- admin_media.* <include refid="Base_Column_List" />, -- ,COUNT(result.id) adslot_amount admin_adslot.id AS slotId FROM admin_media /** 不可用INNER,要有無廣告位都要查出媒體 */ LEFT JOIN admin_adslot ON admin_media.id = admin_adslot.media_id AND admin_adslot.is_deleted = 0 AND admin_media.is_deleted = 0 ) AS result_media /** 必須INNER,媒體必須要顯示更新者和建立者 */ INNER JOIN sys_user u1 ON result_media.`user_id` = u1.id AND u1.is_deleted = 0 INNER JOIN sys_user u2 ON result_media.`user_id_update` = u2.id AND u2.is_deleted = 0 GROUP BY result_media.id </select> <!-- 不行。 <select id="selectAll" resultMap="MediaVOMAP"> select <include refid="Base_Column_List" />, u1.login_name creator_name, u2.login_name updater_name, COUNT(admin_adslot.id) adslot_amount FROM admin_media INNER JOIN sys_user u1 ON admin_media.`user_id` = u1.id AND u1.is_deleted = 0 INNER JOIN sys_user u2 ON admin_media.`user_id_update` = u2.id AND u2.is_deleted = 0 INNER JOIN admin_adslot ON admin_media.id = admin_adslot.media_id AND admin_adslot.is_deleted = 0 AND admin_media.is_deleted = 0 </select>-->