SQL 本体查询不慢 mybatis-plus 的分页功能 Count 总数巨慢 - V2EX
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
DeathBless
V2EX    MySQL

SQL 本体查询不慢 mybatis-plus 的分页功能 Count 总数巨慢

  •  
  •   DeathBless Sep 29, 2020 via Android 7976 views
    This topic created in 2054 days ago, the information mentioned may be changed or developed.
    SQL 本体是个多表联查
    本来也挺慢的 后来 fouce index 主表 ID 后
    查询速度大约只要 300 毫秒

    但是用了 mybatis-plus 的自动分页后
    他会在主 SQL 外套一个 count(1)来查询总数

    本来也没什么问题 但是这个 sql 奇慢无比 大概要 6 秒
    这是为什么 有啥办法优化吗
    27 replies    2020-09-30 09:11:16 +08:00
    BBCCBB
        1
    BBCCBB  
       Sep 29, 2020
    不用他的 page 函数, 自己手动加上 offset limit.
    zoharSoul
        2
    zoharSoul  
       Sep 29, 2020
    把 count 去掉.
    大多数情况下 count 都没啥用, 分页最好换种方式
    DeathBless
        3
    DeathBless  
    OP
       Sep 29, 2020 via Android
    @zoharSoul 因为有查询条件 还不少 每张表都有 变了总数就要变
    maigebaoer
        4
    maigebaoer  
       Sep 29, 2020 via Android
    page count join 耗性能的都被你用上了
    DeathBless
        5
    DeathBless  
    OP
       Sep 29, 2020 via Android
    @maigebaoer 所以怎么办
    ganbuliao
        6
    ganbuliao  
       Sep 29, 2020
    count(*)
    zhaokun
        7
    zhaokun  
       Sep 29, 2020
    他的原理是在你的 sql 外面包了一层 select count(*) from (你的 sql)
    yigedala
        8
    yigedala  
       Sep 29, 2020
    可以 setSearchCount(false)去掉查询总数的,这种分页的需求,如果需求允许的话,不一定每一次翻页都要查一次总数。
    aegon466
        9
    aegon466  
       Sep 29, 2020
    mp 分页还是要全部查出来再分页的 建议自己优化
    zoharSoul
        10
    zoharSoul  
       Sep 29, 2020
    @DeathBless 总数给前端个 99999 得了
    NPC666
        11
    NPC666  
       Sep 29, 2020 via Android
    试试用 pagehelper 进行分页?
    aguesuka
        12
    aguesuka  
       Sep 29, 2020 via Android
    前端要就手写,不要就不查。现代 sql 解释器查总数还要 6 秒说明 sql 有问题,该改改,该加索引加索引,该拆表拆表
    aguesuka
        13
    aguesuka  
       Sep 29, 2020 via Android
    查 count6 秒查数据 0.3 秒估计也做没排序吧?(或者是按主键)这样分页是有问题的
    PhilC
        14
    PhilC  
       Sep 29, 2020
    @zoharSoul 我们之前就这么干的
    cheng6563
        15
    cheng6563  
       Sep 29, 2020 via Android
    数据多了分页要快要这样:
    1.不查总数。
    2.用主键按偏移量分页,这样会限制翻页数量,比如 where id > 2233 limit 20,10

    最好是按日期,时间之类的字段加索引进行限制
    zoharSoul
        16
    zoharSoul  
       Sep 29, 2020
    @PhilC #14
    是啊, 常见做法, 一般 count 对于用户也没啥意义.

    比如我刷 V2EX 也不关心总共多少帖子嘛
    xgq89757
        17
    xgq89757  
       Sep 29, 2020
    @zoharSoul 我们现在就这么干的。今天看到另外一个帖子,用 explan 里的行数,这个不精确,但妙啊
    gundam0603
        18
    gundam0603  
       Sep 29, 2020
    有的版本开始 count 可以手动写,自己写个去掉没有的子查询和关联,会快不少,再慢就只能加 count 的缓存了
    xiaochong0302
        19
    xiaochong0302  
       Sep 29, 2020
    @pierswu 那就要用自定义的分页组件了,其实 count 也可以缓存起来,离不开自定义
    gundam0603
        20
    gundam0603  
       Sep 29, 2020
    @xiaochong0302 直接写 Count 方法覆盖就行了,从某个版本开始就支持了,这种治标不治本,让产品看看需不需要总数吧 或者加条件什么的,数据量大了迟早会不行的
    wa8n
        21
    wa8n  
       Sep 29, 2020
    我的系统日志就是固定 10000 条
    Sasasu
        22
    Sasasu  
       Sep 29, 2020
    带着 fliter 数 count 就是这样子的

    看你们团队谁强势
    - 产品强势:就这么放着,等产品觉得慢,然后告诉他数总数花了 6 秒
    - 开发强势:返回假的总数或者用游标翻页
    lewis89
        23
    lewis89  
       Sep 29, 2020
    还没改吗? 把 SQL parse 好 然后修改语法树 有这么难吗?
    gundam0603
        24
    gundam0603  
       Sep 29, 2020
    @xiaochong0302 搞错了 没这功能。。。。
    yigedala
        25
    yigedala  
       Sep 29, 2020
    @aegon466 mp 分页是会在语句后面再拼上分页语句的,你说的全部查出来是什么意思
    gageshan
        26
    gageshan  
       Sep 29, 2020
    利用自增字段来做分页,where p_id > xxx order by p_id limit 10
    BenjaminReed
        27
    BenjaminReed  
       Sep 30, 2020
    歪个楼,
    楼主大大用 MP 做多表关联分页怎么搞定的?
    是自己手写 SQL 吗?
    About     Help     Advertise     Blog     API     FAQ     Solana     5833 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 141ms UTC 06:42 PVG 14:42 LAX 23:42 JFK 02:42
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86