V2EX = way to explore
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 · 2020-09-29 10:02:35 +08:00 via Android · 6569 次点击
    这是一个创建于 1313 天前的主题,其中的信息可能已经有所发展或是发生改变。
    SQL 本体是个多表联查
    本来也挺慢的 后来 fouce index 主表 ID 后
    查询速度大约只要 300 毫秒

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

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

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

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

    看你们团队谁强势
    - 产品强势:就这么放着,等产品觉得慢,然后告诉他数总数花了 6 秒
    - 开发强势:返回假的总数或者用游标翻页
    lewis89
        23
    lewis89  
       2020-09-29 15:26:19 +08:00
    还没改吗? 把 SQL parse 好 然后修改语法树 有这么难吗?
    gundam0603
        24
    gundam0603  
       2020-09-29 16:15:51 +08:00
    @xiaochong0302 搞错了 没这功能。。。。
    pierswu
        25
    pierswu  
       2020-09-29 16:47:32 +08:00
    @aegon466 mp 分页是会在语句后面再拼上分页语句的,你说的全部查出来是什么意思
    gageshan
        26
    gageshan  
       2020-09-29 17:05:16 +08:00
    利用自增字段来做分页,where p_id > xxx order by p_id limit 10
    BenjaminReed
        27
    BenjaminReed  
       2020-09-30 09:11:16 +08:00
    歪个楼,
    楼主大大用 MP 做多表关联分页怎么搞定的?
    是自己手写 SQL 吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2405 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 08:10 · PVG 16:10 · LAX 01:10 · JFK 04:10
    Developed with CodeLauncher
    ? Do have faith in what you're doing.


    http://www.vxiaotou.com