我在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目录中有个很大的临时文件。
因为实际我需要的仅仅是每个客户最后的一条记录,有没有好的办法来优化这条语句?
谢谢!
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目录中有个很大的临时文件。
因为实际我需要的仅仅是每个客户最后的一条记录,有没有好的办法来优化这条语句?
谢谢!
解决方案 »
- Mysql float类型存放超过百万的数字会自动变成整数并且在个位数上进行四舍五入
- DB2,Informix,Sybase哪个是非关系型的?
- 如何快速地修改表的存储引擎,如何处理?
- mysql5.0数据库导入到其他服务器也是5.0版本 乱码
- 设置了low_priority_updates却依然会被system lock
- asp操作mysql出现中文乱码,走过路过不要错过,帮忙看一下
- 求解?面对 MYSQL 偶不知如何下手,特请诸位大侠给予帮助切切!!!
- 请教windows下 mysql 多主一从的配置
- 关于MYSQL 二进制数据插入问题
- MySQL5.7目录中没有my.ini 还有ProgramData/MySQL文件夹也是空的
- postGreSql 导入数据中有中文内容是出错
- MYSQL存储过程很奇怪的问题,关于光标
如是每个客户编号的最大登记时间:
select a.* from tt a inner join
(select 客户编号,max(登记时间) as ma from tt group by 客户编号) b
on a.客户编号=b.客户编号 and a.登记时间=b.ma
不用要求登记时间有序,其实找最大的时间即可。不知道还有没有更好的办法?
(select 客户编号,max(登记时间) as ma from tt group by 客户编号) b
on a.客户编号=b.客户编号 and a.登记时间=b.ma应该是效率最高的SQL语句了