向各位请教 sql 优化问题

2017-04-09 13:22:01 +08:00
 magzza
select a.dept,a.cid,a.carno,(select top 1 gt+';'+x_baidu+';'+y_baidu+';'+st from gps b where b.cid = a.cid order by id desc ) conts from gps_car a

gps_car 是车辆表, gps 表是 gps 表,367 万条数据.
现在是想获取车辆表中每辆车在 gps 表中最新的一条 gps 信息。
请教各人达人,我如上的 sql 语句要 20s 以上,该如何优化?
1578 次点击
所在节点    数据库
5 条回复
incompatible
2017-04-09 13:50:43 +08:00
你这个需求还是从应用层面优化吧。
建一个 latest_gps 表,存每辆车的最新一条的 gps 数据,车辆上报了最新的 gps 后更新此表。
查询时 select from 此表不用加任何 where 条件即可。
ivvei
2017-04-09 17:11:02 +08:00
不要把 select top 那句写到 外面这句的 select 部分。你放到后面去,做 join 都比现在这样强。

说到, SQL 优化,先看执行计划。
rqrq
2017-04-09 18:13:23 +08:00
select * from gps_car a inner join (select max(gps.自增字段), gps.cid from gps inner join gps_car on gps.cid = gps_car.cid group by gps.cid) b on a.cid = b.cid

不过这样写, join 子查询用不了索引。
ebony0319
2017-04-09 18:21:57 +08:00
没有一个静态表记录最后的 gps 位置要搞死人的,不管怎么写都要去扫描那个表。
mko0okmko0
2017-04-10 12:53:06 +08:00
补充楼上大家的东西:
建议 mongodb(ram db 一类)+传统资料库
mongodb 存放最后位置,甚至还可以设计局部经纬度聚合,用于查询某区域有多少人,或区域热点,或快查此区域每个人的位置,
传统资料库就一直存入每个人的位置,不做查询或是把查询设计到 mongodb 上.
速度差的不是一个等级,是好几个等级 @@

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/353564

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX