我在MYSQL中有一个表A,里面有几百万条记录,最高可能到几千万条记录,表中有大概有20个字段,我实际需要的是两个字段客户编号B和登记时间C,因为每一个客户编号可能有很多条记录,每条记录对应的登记时间是不同的,我需要查询每个客户的最新时间的一条记录,即最后一条记录。我现在用的SQL语句是:
SELECT a.B,a.C FROM (SELECT B, C FROM A WHERE C>'20071227090000' ORDER BY C DESC) AS a GROUP BY a.B ORDER BY a.B;
在26万条记录的时候,查询时间大概是0.84s左右。但中间需要对所有的记录先根据C进行排序,创建一个临时表,如果数据记录比较多,就造成mysqltmp目录中有个很大的临时文件。
因为实际我需要的仅仅是每个客户最后的一条记录,有没有好的办法来优化这条语句?
谢谢!

解决方案 »

  1.   

    最后一条记录的时间:是最大吗?
    如是每个客户编号的最大登记时间:
    select a.* from tt a inner join
    (select 客户编号,max(登记时间) as ma from tt group by 客户编号) b
    on a.客户编号=b.客户编号 and a.登记时间=b.ma
      

  2.   

    我后来修改的就是WWWWA兄说的max(登记时间)方法,而不用原来的嵌套查询。估计这样会好一些,不用产生临时表了。
     不用要求登记时间有序,其实找最大的时间即可。不知道还有没有更好的办法?
      

  3.   

    select   a.*   from   tt   a   inner   join
    (select   客户编号,max(登记时间)   as   ma   from   tt   group   by   客户编号)   b
    on   a.客户编号=b.客户编号   and   a.登记时间=b.ma应该是效率最高的SQL语句了