V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
magzza
V2EX  ›  数据库

向各位请教 sql 优化问题

  •  
  •   magzza · 2017-04-09 13:22:01 +08:00 · 1577 次点击
    这是一个创建于 2820 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 以上,该如何优化?
    5 条回复    2017-04-10 12:53:06 +08:00
    incompatible
        1
    incompatible  
       2017-04-09 13:50:43 +08:00 via iPhone
    你这个需求还是从应用层面优化吧。
    建一个 latest_gps 表,存每辆车的最新一条的 gps 数据,车辆上报了最新的 gps 后更新此表。
    查询时 select from 此表不用加任何 where 条件即可。
    ivvei
        2
    ivvei  
       2017-04-09 17:11:02 +08:00
    不要把 select top 那句写到 外面这句的 select 部分。你放到后面去,做 join 都比现在这样强。

    说到, SQL 优化,先看执行计划。
    rqrq
        3
    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
        4
    ebony0319  
       2017-04-09 18:21:57 +08:00 via Android
    没有一个静态表记录最后的 gps 位置要搞死人的,不管怎么写都要去扫描那个表。
    mko0okmko0
        5
    mko0okmko0  
       2017-04-10 12:53:06 +08:00
    补充楼上大家的东西:
    建议 mongodb(ram db 一类)+传统资料库
    mongodb 存放最后位置,甚至还可以设计局部经纬度聚合,用于查询某区域有多少人,或区域热点,或快查此区域每个人的位置,
    传统资料库就一直存入每个人的位置,不做查询或是把查询设计到 mongodb 上.
    速度差的不是一个等级,是好几个等级 @@
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2803 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 13:11 · PVG 21:11 · LAX 05:11 · JFK 08:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.