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 · 6861 次点击
    这是一个创建于 1498 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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   ·   实用小工具   ·   5465 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 05:49 · PVG 13:49 · LAX 21:49 · JFK 00:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.