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

求教大佬 sql 问题

  •  
  •   chaodada · 46 天前 · 1534 次点击
    这是一个创建于 46 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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