MySQL group by 优化 - 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
test523
V2EX    MySQL

MySQL group by 优化

  •  1
     
  •   test523 Jan 28, 2022 4304 views
    This topic created in 1570 days ago, the information mentioned may be changed or developed.

    目的取一段时间内 uid 对应消耗,然后划分区间

    发现 group by uid返回的数据越多越慢,这个从 SQL 下手有优化空间吗

    MySQL 5.7 select elt(interval(total, null, 300), '-INF~300', '300~INF') as section, count(*) AS total from ( select uid, SUM(gold) as total from `table_name` where `time` > 1640966400 and `time` <= 1642176000 group by `uid` ) as `tmp` group by `section`; -- 执行了 3-4 秒 返回结果: -INF~300 46319 300~INF 15060 

    EXPLAIN 结果:

    select_type table type possible_keys rows rows
    PRIMARY <derived2> ALL 217073 Using temporary; Using filesort
    DERIVED table_name index time,uid 434146 Using where
    Supplement 1    Jan 28, 2022

    附上表结构

    CREATE TABLE `table_name` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `time` int(11) unsigned NOT NULL DEFAULT '0', `uid` bigint(20) unsigned NOT NULL DEFAULT '0', `gold` bigint(20) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `time` (`time`), KEY `uid` (`uid`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 
    16 replies    2022-02-08 17:34:27 +08:00
    enjoychen0318
        1
    enjoychen0318  
       Jan 28, 2022
    加个 order by null 试试?
    test523
        2
    test523  
    OP
       Jan 28, 2022
    @enjoychen0318 作用不大,还是很慢
    xshell
        3
    xshell  
       Jan 28, 2022
    没走索引
    Gota
        4
    Gota  
       Jan 28, 2022
    猜测省掉一次 group 会不会好一点? 不过我没数据也不好试, 写出来大概是这样.

    select
    SUM(lt300) as lt300,
    SUM(gt300) as gt300
    from (
    select
    IF(SUM(gold) < 300, 1, 0) as lt300,
    IF(SUM(gold) < 300, 0, 1) as gt300
    from `table_name`
    where `time` > 1640966400 and `time` <= 1642176000
    group by `uid`
    ) as `tmp`
    blakejia
        5
    blakejia &bsp;
       Jan 28, 2022
    select
    uid,
    SUM(gold) as total
    from `table_name`
    where `time` > 1640966400 and `time` <= 1642176000 group by `uid`

    第一层耗时多少秒?
    sanggao
        6
    sanggao  
       Jan 28, 2022
    time 加索引,并且 force use time 这个索引
    test523
        7
    test523  
    OP
       Jan 28, 2022
    @blakejia 第一层 3 秒左右

    @sanggao time
    test523
        8
    test523  
    OP
       Jan 28, 2022
    @sanggao 刚才不小心点错了,

    time 是有索引,FORCE INDEX(time)后耗时减少 1s
    galileo1214
        9
    galileo1214  
       Jan 28, 2022
    开窗?
    blakejia
        10
    blakejia  
       Jan 28, 2022
    整表有多少数据量呢?
    23fksd
        11
    23fksd  
       Jan 28, 2022
    联合索引+覆盖:CREATE INDEX idx_uid_time_gold ON table_name (uid,`time`,gold);
    Masonnn
        12
    Masonnn  
       Jan 29, 2022
    可以,就在这个帖子里学到了 elt()、interval()、force index()
    a222QAQ
        13
    a222QAQ  
       Jan 29, 2022 via Android
    @sweetsorrow211 学习+1
    opengps
        14
    opengps  
       Jan 30, 2022
    我理解,time 和 uid 应该是个联合索引
    whoisix
        15
    whoisix  
       Feb 7, 2022
    mark ,学习+1
    thinkmore
        16
    thinkmore  
       Feb 8, 2022
    尝试建立下 index(time,uid ,gold)联合索引,不知道是否可以提供数据供分析
    About     Help     Advertise     Blog     API     FAQ     Solana     3842 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 59ms UTC 04:28 PVG 12:28 LAX 21:28 JFK 00:28
    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