慢查询:根据每个组的另一列上的 min 和 max 查找值之间的差异 [英] Slow query: find difference between values base on min and max on another column for each group

查看:61
本文介绍了慢查询:根据每个组的另一列上的 min 和 max 查找值之间的差异的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

参考仅当高于 0 时才计算每列的最小值和最大值之间的差.

对于选定的odds_type,对于每个相同的fix_id,我正在寻找更新列中MIN和MAX的赔率差异.通过输出,我想取回更新列中的值为最大值的其他行.这就是我的桌子的样子

I'm looking for a difference in odds where MIN and MAX in updated column for each same fix_id for selected odds_type. With the output I would like to get back other rows where value in updated column was max. That's how my table looks like

<头>
fix_id赔率市场更新输入
1201.80home 160平均
1201.40home150平均
1202.00home 110 平均
1881.00u/o200REG
1211.60离开 160 平均
1211.40离开150平均
1211.10离开 110 平均

我期待得到什么

<头>
fix_id赔率市场更新差异输入
1201.80home160-0.2平均
1211.60离开1600.5平均

我正在使用的代码正在运行,但处理时间太长,而且数据越多,我就会出现超时错误

The code I'm using is working but it takes too much time to process and with more data I get time out error

  SELECT a.*
, a.odds - b.odds delta
FROM 
( SELECT x.*
 FROM average_odds x
 JOIN
    ( SELECT fix_id
           , market
           , MAX(updated) min_updated
        FROM average_odds x where type='avg'
       GROUP BY fix_id
           , market
    ) y
   ON y.fix_id = x.fix_id
  AND y.market = x.market
  AND y.min_updated = x.updated
) a
JOIN
( SELECT x.*
 FROM average_odds x
 JOIN
    ( SELECT fix_id
           , market
           , MIN(updated) min_updated
        FROM average_odds x where  type='avg'
       GROUP BY fix_id
           , market
    ) y
   ON y.fix_id = x.fix_id
  AND y.market = x.market
  AND y.min_updated = x.updated
) b
ON b.fix_id = a.fix_id
AND b.market = a.market  
ORDER BY `delta` ASC

这里也是查询用了 15 秒的 sql 的解释表

Here is also explain table from sql for the query that took 15 seconds

<头>
IDS TYPE表格..parti输入pos_keysKEYkey lenref过滤额外
1PRIMARY衍生3>null全部nullnullnullnull17466100.00使用临时的;使用文件排序
1PRIMARYxnullref修复、修复、市场、更新修复4y.fix_id5960.11使用 where
1PRIMARYxnullref修复、修复、市场、更新修复4y.fix_id5962.27使用 where
1PRIMARY衍生5>nullrefauto_key0>auto_key0>31y.fix_id,y.market,bobi.x.updated10100.00使用索引
5派生xnullrefbokiboki4const17466100.00使用索引条件;使用临时;使用文件...
3派生xnullrefbokiboki4const17466100.00使用索引条件;使用临时;使用文件...

有一个表格定义

<头>
字段TYPENULLkey默认额外
fix_idint(20)noMULNULL
市场varchar(20)noMULNULL
标签varchar(20)noNULL
赔率十进制(4,2)noNULL
更新int(20)noMULNULL
ev_tstampint(20)noNULL
TYPEvarchar(20)noMULNULL
market_idint(20)noNULL

目前查询需要 15 秒才能在大约 75 000 行上执行,但大部分时间我都会出现超时错误.我需要在有 500 000 行的表上使用它,我想知道这是否可能.P.S 我使用的是 MySQL 5.7.29 并且我在共享服务器上,所以我无法将其升级到 8

At the moment the query takes 15s to perform on around 75 000 rows but most of the time I get time out error. I need to use it on table with 500 000 rows and I wonder if that's possible. P.S I'm using MySQL 5.7.29 and I'm on the share server so I'm not able to upgrade it to 8

推荐答案

使用 NOT EXISTS 过滤表和相关子查询以获得最早odds代码>更新:

Use NOT EXISTS to filter the table and a correlated subquery to get the odds for the earliest update:

SELECT a.*,
       a.odds - (SELECT t.odds FROM average_odds t WHERE t.fix_id = a.fix_id ORDER BY t.updated LIMIT 1) diff
FROM average_odds a
WHERE type = 'avg'
  AND NOT EXISTS (SELECT 1 FROM average_odds t WHERE t.fix_id = a.fix_id AND t.updated > a.updated)

请参阅演示.结果:

<头>
fix_id赔率市场更新输入差异
1201.80home160平均-0.20
1211.60离开160平均0.50

这篇关于慢查询:根据每个组的另一列上的 min 和 max 查找值之间的差异的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆