比如我有一张表tableA,2亿条记录,15个字段左右,没有特别建立索引,主键是一个ID列,不考虑按月份分表,分库的情况。目前是按年分表,这个查询的目的是要查询所有用户在指定的时间段内,最后的登陆时间的那条记录。
在sql server的ssms里运行了以下查询语句:
select t1.id,t1.姓名,t1.登陆时间,......
from tableA AS t1
right outer join
(
select 姓名,MAX(登陆时间)
from tableA where 登陆时间 between '开始时间' and '结束时间' group by 姓名
) as t2
on t1.姓名=t2.姓名 and t1.登陆时间=t2.登陆时间
整个语句运行大概需要10分钟左右,我单独测试了每条语句,以下这句话的查询时间大概在80秒左右:
select 姓名,MAX(登陆时间)
from tableA where 登陆时间 between '开始时间' and '结束时间' group by 姓名
后来测试了按月分表的情况,嵌套的类似上面的语句,大概在2秒多,总体的在20秒左右,情况有明显。目前我的疑问就是差距为什么这么大,我实在不想按月分表,临时表和存储过程能解决这个问题么?这两种方案我不熟,没有测试,数据库操作水平有限,边摸索边试验的,但是看了临时表和存储过程的介绍,感觉临时表和存储过程无法解决查询速度快慢的问题。
分数有限,请谅解,讨论技术
。