FASTest> mysql获取最后的不同记录返回所有列

时间:2014-11-03 14:51:42

标签: mysql performance max distinct

idx info    market  po  side    odd     unique_odd
10  927606  OU_OT   2.5 under   2.01    927606_OU_2.5_under
11  927606  OU_OT   2.5 under   2.02    927606_OU_2.5_under
12  927606  OU_OT   2.5 over    1.81    927606_OU_2.5_over
13  927776  OU_OT   3.5 under   1.67    927776_OU_3.5_under
14  927776  OU_OT   3.5 over    2.11    927776_OU_3.5_over
15  927776  OU_OT   3.5 over    2.31    927776_OU_3.5_over

odds_etc DATABASE就在这里。

我想输出这些。

11  927606  OU_OT   2.5 under   2.02    927606_OU_2.5_under
12  927606  OU_OT   2.5 over    1.81    927606_OU_2.5_over
13  927776  OU_OT   3.5 under   1.67    927776_OU_3.5_under
15  927776  OU_OT   3.5 over    2.31    927776_OU_3.5_over

这意味着unique_odd和MAX(idx)不同 它可能低于sql,但需要7秒。它太长了,我想要1~2秒。

SELECT T1.* FROM odds_etc T1
INNER JOIN (SELECT unique_odd,MAX(idx) as maxidx FROM odds_etc GROUP BY unique_odd) groupT2
ON T1.unique_odd = groupT2.unique_odd AND T1.idx = groupT2.maxidx 
WHERE info='$info'

1 个答案:

答案 0 :(得分:0)

如果索引位于odds_etc(unique_odd, idx),则以下查询可能会有更好的效果:

select oe.*
from odds_etc oe
where info = '$info' and
      not exists (select 1
                  from odds_etc oe2
                  where oe2.unique_odd = oe.unique_odd and
                        oe2.idx > oe.idx
                 );

将查询短语为:"获取unique_odd没有idx更高值的所有行。"这是一种更复杂的说法:"为每个idx获取最多unique_odd的行。"但是这个版本可以利用上面的索引,这可以提高性能。

您可能还需要odds_etc(info, unique_odd, idx)上的索引。

编辑:

要获得性能,您需要以下两个索引:

create index idx_odds_etc_unique_odd_idx on odds_etc(unique_odd, idx);
create index idx_odds_etc_info_unique_odd_idx on odds_etc(info, unique_odd, idx);