› 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 · 4008 views
    This topic created in 2248 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
    brader
    Sep 14, 2020
    1
    你方便使用 `EXPLAIN` 看下你的执行计划,然后贴出来吗?
    VeryZero
    VeryZero
    Sep 14, 2020❤️1
    2
    起码发下表结构啊
    wakzz
    wakzz
    Sep 14, 2020❤️1
    3
    表结构和表数据量
    pushback
    pushback
    Sep 14, 2020❤️1
    4
    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
    justgodlike1993
    Sep 14, 2020❤️1
    5
    新建个(uid,ordertiem,orderid)的索引,避免排序
    justgodlike1993
    justgodlike1993
    Sep 14, 2020❤️1
    6
    @justgodlike1993 看错了 (lll ¬ω¬)
    kiracyan
    kiracyan
    Sep 14, 2020❤️1
    7
    歪个楼 只 group by 'order_id' 这个 SQL 可以跑吗
    des
    des
    Sep 14, 2020❤️1
    8
    @kiracyan mysql 是这样的,新版本需要加 ANY_VALUE
    chaodada
    chaodada
    OP
    Sep 14, 2020
    9
    @wakzz 感谢大佬的回复 数量大概是 1400w 左右
    chaodada
    chaodada
    OP
    Sep 14, 2020
    10
    这个状况 很奇怪 就慢那一次 然后过个一个多小时 就 出现慢一次 然后一直这样子
    MaxFang
    MaxFang
    Sep 14, 2020
    11
    @chaodada 可能是查询缓存。可以发下表结构,如果 uid 有索引的话,理论上不会太多啊,单用户的订单量会有多少呢。
    justgodlike1993
    justgodlike1993
    Sep 15, 2020
    13
    新建个(uid,order_id)的索引,然后看看执行计划还有排序不
    brader
    brader
    Sep 15, 2020
    14
    @justgodlike1993 我觉得建立(uid,order_id)是不起作用的,应该建立(uid,ordertiem)索引,从执行计划以及查询结果综合分析,应该能将扫描行数从 44000 行缩减到 22000 行左右。

    当然,不管是 4 万行,还是 2 万行,mysql 的文件排序,我认为不应如此慢,综合楼主上面提到的,是偶然亦或规律性出现这样的问题,那么我觉得还应该考虑是否出现了锁等待,比如:是否有某个定时任务。
    gakkiismywife1
    gakkiismywife1
    Sep 15, 2020
    15
    看下是否是在内存中排序还是外部排序,外部排序相对会比较慢
    gakkiismywife1
    gakkiismywife1
    Sep 15, 2020
    16
    @gakkiismywife1 看错了不是排序 哈哈哈
    chaodada
    chaodada
    OP
    Sep 15, 2020
    17
    @brader 确实我门这个数据表 读写特别频繁。。。
    wakzz
    wakzz
    Sep 15, 2020
    18
    用 uid 索引,不慢才怪呢,会对 uid=726080 的所有记录回表。建议对 uid,ordertime,order_id 做联合索引,减少回表次数。
    wakzz
    wakzz
    Sep 15, 2020
    19
    以及执行一下命令`show global status like '%tmp%';`,看看临时表有多少次是创建了磁盘临时表。磁盘临时表会非常影响性能。
    chaodada
    chaodada
    OP
    Sep 15, 2020 via iPhone
    20
    @wakzz #19 感谢大佬的回复,我尝试一下😚😚
    MaxFang
    MaxFang
    Sep 15, 2020
    21
    可以按照前面老哥说的方法看看系统临时表的配置,查询的数据要进行 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   ·   1483 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 16:42 · PVG 00:42 · LAX 08:42 · JFK 11:42
    ♥ Do have faith in what you're doing.