有ci_trail表,字段为:id, uid(用户id), address(地址), create_time 记录人的定位轨迹,此表大概有100w条数据。想查询每个人最新的一条地址信息。使用如下sql:
explain
select id, uid, address, create_time from ci_trail where id in(
select max(id) from ci_trail group by uid
);
查询计划如下图:
可见进行了全表扫描,查询效率很低,请问这种情况应该如何优化sql?
已解决
方案1:
SELECT t.id, t.uid, t.address, t.create_time
FROM ci_trail t
JOIN (
SELECT uid, MAX(id) AS max_id
FROM ci_trail
GROUP BY uid
) t2 ON t.uid = t2.uid AND t.id = t2.max_id;
方案2:
先将子查询中的id查询出来,然后将id的结果集逗号隔开填充到in中。因为in的内容是常量,所以会快一些。