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 · 21 天前 via Android · 1895 次点击
    SQL 本体是个多表联查
    本来也挺慢的 后来 fouce index 主表 ID 后
    查询速度大约只要 300 毫秒

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

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

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

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

    看你们团队谁强势
    - 产品强势:就这么放着,等产品觉得慢,然后告诉他数总数花了 6 秒
    - 开发强势:返回假的总数或者用游标翻页
    lewis89
        23
    lewis89   20 天前
    还没改吗? 把 SQL parse 好 然后修改语法树 有这么难吗?
    gundam0603
        24
    gundam0603   20 天前
    @xiaochong0302 搞错了 没这功能。。。。
    pierswu
        25
    pierswu   20 天前
    @aegon466 mp 分页是会在语句后面再拼上分页语句的,你说的全部查出来是什么意思
    gageshan
        26
    gageshan   20 天前
    利用自增字段来做分页,where p_id > xxx order by p_id limit 10
    lijinxhua
        27
    lijinxhua   20 天前
    歪个楼,
    楼主大大用 MP 做多表关联分页怎么搞定的?
    是自己手写 SQL 吗?
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4807 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 06:28 · PVG 14:28 · LAX 23:28 · JFK 02:28
    ♥ Do have faith in what you're doing.