› 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
chaodada
V2EX  ›  MySQL

求教大佬 sql 问题

  •  
  •   chaodada · Sep 14, 2020 · 3882 views
    This topic created in 2202 days ago, the information mentioned may be changed or developed.

    sql 如下

    SELECT sum(money) as money,order_id,ordertime,earning_time FROM `wx_lianmeng_relation` force index(uid)  WHERE uid=726080 and `ordertime`>=1590940800 GROUP BY `order_id`
    

    当执行该语句时 Copying To Tmp Table 有时候会存在 5-6 秒左右的耗时

    这是我的配置 求大佬执教... https://p.pstatp.com/origin/137650001eeb8c64440ad

    https://p.pstatp.com/origin/1384400013664b8722789

    21 replies  •  2020-09-15 21:30:49 +08:00
    brader
        1
    brader  
       Sep 14, 2020
    你方便使用 `EXPLAIN` 看下你的执行计划,然后贴出来吗?
    VeryZero
        2
    VeryZero  
       Sep 14, 2020   ❤️ 1
    起码发下表结构啊
    wakzz
        3
    wakzz  
       Sep 14, 2020   ❤️ 1
    表结构和表数据量
    pushback
        4
    pushback  
       Sep 14, 2020   ❤️ 1
    SELECT
    model.*,
    (SELECT SUM(money) FROM `wx_lianmeng_relation` WHERE order_id = model.order_id) as money
    FROM
    (
    order_id,
    ordertime,
    earning_time
    FROM
    `wx_lianmeng_relation` FORCE INDEX ( uid )
    WHERE
    uid = 726080
    AND `ordertime` >= 1590940800
    GROUP BY
    `order_id`
    ) as model

    @chaodada 你试试这个,聚合函数和 group by 在处理同一结果集时会变慢,具体还需要看文档,总之先用 model 包一层缩小结果集吧
    justgodlike1993
        5
    justgodlike1993  
       Sep 14, 2020   ❤️ 1
    新建个(uid,ordertiem,orderid)的索引,避免排序
    justgodlike1993
        6
    justgodlike1993  
       Sep 14, 2020   ❤️ 1
    @justgodlike1993 看错了 (lll ¬ω¬)
    kiracyan
        7
    kiracyan  
       Sep 14, 2020   ❤️ 1
    歪个楼 只 group by 'order_id' 这个 SQL 可以跑吗
    des
        8
    des  
       Sep 14, 2020   ❤️ 1
    @kiracyan mysql 是这样的,新版本需要加 ANY_VALUE
    chaodada
        9
    chaodada  
    OP
       Sep 14, 2020
    @wakzz 感谢大佬的回复 数量大概是 1400w 左右
    chaodada
        10
    chaodada  
    OP
       Sep 14, 2020
    这个状况 很奇怪 就慢那一次 然后过个一个多小时 就 出现慢一次 然后一直这样子
    MaxFang
        11
    MaxFang  
       Sep 14, 2020
    @chaodada 可能是查询缓存。可以发下表结构,如果 uid 有索引的话,理论上不会太多啊,单用户的订单量会有多少呢。
    justgodlike1993
        13
    justgodlike1993  
       Sep 15, 2020
    新建个(uid,order_id)的索引,然后看看执行计划还有排序不
    brader
        14
    brader  
       Sep 15, 2020
    @justgodlike1993 我觉得建立(uid,order_id)是不起作用的,应该建立(uid,ordertiem)索引,从执行计划以及查询结果综合分析,应该能将扫描行数从 44000 行缩减到 22000 行左右。

    当然,不管是 4 万行,还是 2 万行,mysql 的文件排序,我认为不应如此慢,综合楼主上面提到的,是偶然亦或规律性出现这样的问题,那么我觉得还应该考虑是否出现了锁等待,比如:是否有某个定时任务。
    gakkiismywife1
        15
    gakkiismywife1  
       Sep 15, 2020
    看下是否是在内存中排序还是外部排序,外部排序相对会比较慢
    gakkiismywife1
        16
    gakkiismywife1  
       Sep 15, 2020
    @gakkiismywife1 看错了不是排序 哈哈哈
    chaodada
        17
    chaodada  
    OP
       Sep 15, 2020
    @brader 确实我门这个数据表 读写特别频繁。。。
    wakzz
        18
    wakzz  
       Sep 15, 2020
    用 uid 索引,不慢才怪呢,会对 uid=726080 的所有记录回表。建议对 uid,ordertime,order_id 做联合索引,减少回表次数。
    wakzz
        19
    wakzz  
       Sep 15, 2020
    以及执行一下命令`show global status like '%tmp%';`,看看临时表有多少次是创建了磁盘临时表。磁盘临时表会非常影响性能。
    chaodada
        20
    chaodada  
    OP
       Sep 15, 2020 via iPhone
    @wakzz #19 感谢大佬的回复,我尝试一下😚😚
    MaxFang
        21
    MaxFang  
       Sep 15, 2020
    可以按照前面老哥说的方法看看系统临时表的配置,查询的数据要进行 group by 操作,内存中放不下就会使用临时表。至于 file sort 可能是和你强制使用 uid 索引,order by 的又是 order_id 相关。
    这部分可以参考: https://www.cnblogs.com/kramer/p/6703750.html
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2598 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 14:55 · PVG 22:55 · LAX 07:55 · JFK 10:55
    ♥ Do have faith in what you're doing.