代碼CR之分頁查詢常見問題

分頁查詢常見問題:
  • 1.完全沒有分頁
  • 2.分頁size太大
  • 3.超多分頁慢SQL
1.完全沒有分頁

反例:


private List<OrderDTO> queryOrderList(Long customerId) {
    if (customerId == null) {
        return Lists.newArrayList();
    }

    List<OrderDO> orderDOList = orderMapper.list(customerId);
    return orderConverter.doList2dtoList(orderDOList);
}

正例:

private Page<OrderDTO> queryOrderList(OrderPageQuery query) {
    Preconditions.checkNotNull(query, "查詢條件不能為空");
    Preconditions.checkArgument(query.getPageSize() <= MAX_PAGE_SIZE, "分頁size不能大于" + MAX_PAGE_SIZE);
    // 分頁size一般由前端傳入
    // query.setPageSize(20);
    long cnt = orderMapper.count(query);
    if (cnt == 0) {
        return PageQueryUtil.buildPageData(query, null, cnt);
    }
    List<OrderDO> orderDOList = orderMapper.list(query);
    List<OrderDTO> orderDTOList = orderConverter.doList2dtoList(orderDOList);
    return PageQueryUtil.buildPageData(query, orderDTOList, cnt);
}

沒有分頁的列表查詢對 DB 性能影響非常大鳍怨,特別是在項目初期蒿柳,因為數(shù)據(jù)量非常小問題不明顯,而導(dǎo)致沒有及時發(fā)現(xiàn)岳枷,會給未來留坑芒填。

2.分頁size太大

反例:


private Page<OrderDTO> queryOrderList2(OrderPageQuery query) {
    Preconditions.checkNotNull(query, "查詢條件不能為空");
    query.setPageSize(10000);
    long cnt = orderMapper.count(query);
    if (cnt == 0) {
        return PageQueryUtil.buildPageData(query, null, cnt);
    }
    List<OrderDO> orderDOList = orderMapper.list(query);
    List<OrderDTO> orderDTOList = orderConverter.doList2dtoList(orderDOList);
    return PageQueryUtil.buildPageData(query, orderDTOList, cnt);
}

分頁 size 的大小并沒有一個固定的標(biāo)準(zhǔn),取決于業(yè)務(wù)需求空繁、數(shù)據(jù)量及數(shù)據(jù)庫等殿衰,但動輒幾千上萬的分頁 size,會帶來性能瓶頸盛泡,而大量的慢 SQL 不但影響客戶體驗闷祥,對系統(tǒng)穩(wěn)定性也是極大的隱患。

3.超多分頁慢SQL

反例:


<!-- 分頁查詢訂單列表 -->
<select id="list" parameterType="com.xxx.OrderPageQuery" resultType="com.xxx.OrderDO">
    SELECT
        <include refid="all_columns"/>
    FROM t_order
        <include refid="listConditions"/>
    ORDER BY id DESC
    LIMIT #{offset},#{pageSize}
</select>

正例:


<!-- 分頁查詢訂單列表 -->
<select id="list" parameterType="com.xxx.OrderPageQuery" resultType="com.xxx.OrderDO">
    SELECT
        <include refid="all_columns"/>
    FROM t_order a
    INNER JOIN (
        SELECT id AS bid
        FROM t_order
            <include refid="listConditions"/>
        ORDER BY id DESC
        LIMIT #{offset},#{pageSize}
    ) b ON a.id = b.bid
</select>

以上 bad case 的 SQL 在超多頁分頁查詢時性能極其低下傲诵,存在多次回表甚至 Using Filesort 的問題凯砍,在阿里巴巴編碼規(guī)范中也有明確的規(guī)避方案,此處不展開拴竹。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末悟衩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子栓拜,更是在濱河造成了極大的恐慌座泳,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幕与,死亡現(xiàn)場離奇詭異挑势,居然都是意外死亡,警方通過查閱死者的電腦和手機啦鸣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門潮饱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人诫给,你說我怎么就攤上這事香拉∷茄” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵缕溉,是天一觀的道長。 經(jīng)常有香客問我吃型,道長证鸥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任勤晚,我火速辦了婚禮枉层,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赐写。我一直安慰自己鸟蜡,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布挺邀。 她就那樣靜靜地躺著揉忘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪端铛。 梳的紋絲不亂的頭發(fā)上泣矛,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機與錄音禾蚕,去河邊找鬼您朽。 笑死,一個胖子當(dāng)著我的面吹牛换淆,可吹牛的內(nèi)容都是我干的哗总。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼倍试,長吁一口氣:“原來是場噩夢啊……” “哼讯屈!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起易猫,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤耻煤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后准颓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哈蝇,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年攘已,在試婚紗的時候發(fā)現(xiàn)自己被綠了炮赦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡样勃,死狀恐怖吠勘,靈堂內(nèi)的尸體忽然破棺而出性芬,到底是詐尸還是另有隱情,我是刑警寧澤剧防,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布植锉,位于F島的核電站,受9級特大地震影響峭拘,放射性物質(zhì)發(fā)生泄漏俊庇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一鸡挠、第九天 我趴在偏房一處隱蔽的房頂上張望辉饱。 院中可真熱鬧,春花似錦拣展、人聲如沸彭沼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽姓惑。三九已至,卻和暖如春瓜喇,著一層夾襖步出監(jiān)牢的瞬間挺益,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工乘寒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留望众,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓伞辛,卻偏偏與公主長得像烂翰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蚤氏,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容