我怎样才能更快地订购?

时间:2016-03-23 10:49:36

标签: mysql

当我在大表(160000行)中使用 ORDER BY 时,这样:

select HomeTeam,AwayTeam,FTR,FTHG,FTAG,HS,`AS`,`Date`,Elo1A,Elo1B,Elo2A,Elo2B,Elo3A,Elo3B,Elo4A,Elo4B,nElo1A,nElo1B,nElo2A,
        nElo2B,nElo3A,nElo3B,nElo4A,nElo4B from historic
        where (HomeTeam='Crystal Palace' or AwayTeam='Crystal Palace') and datediff('1994-08-20',Date)>0 order by `Date` desc limit 1

获取持续时间 1.078秒/0.000秒

当我在没有 ORDER BY 的情况下使用时:

select HomeTeam,AwayTeam,FTR,FTHG,FTAG,HS,`AS`,`Date`,Elo1A,Elo1B,Elo2A,Elo2B,Elo3A,Elo3B,Elo4A,Elo4B,nElo1A,nElo1B,nElo2A,
        nElo2B,nElo3A,nElo3B,nElo4A,nElo4B from historic
        where (HomeTeam='Crystal Palace' or AwayTeam='Crystal Palace') and datediff('1994-08-20',Date)>0 limit 1

获取持续时间 0.187秒/0.000秒

问题是没有ORDER BY我得错了结果:

  

Crystal Palace Tranmere 1993-08-14

但正确的是使用ORDER BY:

  

水晶宫沃特福德1994-05-08

如何避免ORDER BY或以某种方式更智能地调用当前比赛的最后一场比赛?

1 个答案:

答案 0 :(得分:0)

根据我们在评论中的对话,您已在日期字段中创建索引并通过它获得性能 -

此外,您可以尝试以下查询,这可能会为您提供更好的效果 -

SELECT HomeTeam,AwayTeam,FTR,FTHG,FTAG,HS,`AS`,`Date`,Elo1A,Elo1B,Elo2A,Elo2B,Elo3A,Elo3B,Elo4A,Elo4B,nElo1A,nElo1B,nElo2A,
        nElo2B,nElo3A,nElo3B,nElo4A,nElo4B FROM historic
        WHERE (HomeTeam='Crystal Palace' OR AwayTeam='Crystal Palace') and `Date` < '1994-08-20' ORDER BY `Date` DESC LIMIT 1;

注意:这里我只是从日期字段中删除函数,以便它也可以使用索引来过滤数据。