• 售前

  • 售后

热门帖子
入门百科

Mysql查询最近一条记载的sql语句(优化篇)

[复制链接]
123456868 显示全部楼层 发表于 2021-10-26 12:30:46 |阅读模式 打印 上一主题 下一主题
下策——查询出结果后将时间排序后取第一条
  1. select * from a
  2. where create_time<="2017-03-29 19:30:36"
  3. order by create_time desc
  4. limit 1
复制代码
如许做虽然可以取出当前时间近来的一条记录,但是一次查询必要将表遍历一遍,对于百万以上数据查询将比较费时;limit是先取出全部结果,然后取第一条,相当于查询中占用了不必要的时间和空间;还有如果必要批量取出近来一条记录,比方说:“一个订单表,有用户,订单时间,金额,必要一次性查询全部用户的近来的一条订单记录”,那么每个用户一次查询就要做一次整表的遍历,数据大的环境下,时间将会以指数情势增长,不能投入实际使用。
中策——查询排序后group by
  1. select * from (
  2.   select * from a
  3.   where create_time<="2017-03-29 19:30:36"
  4.   order by create_time desc
  5. )  group by user_id
复制代码
后来发现使用group by 可以根据group by 的参数列分组,但返回的结果只有一条,仔细观察发现group by是将分组后的第一条记录返回。时间在查询后默认是次序分列,因此必要先将时间倒序分列,方可取出隔断当前近来一条。
如许查询实际上还是举行了两次查询,虽然时间上相比第一个方法有了质的飞跃,但是还可以进一步优化。
上策——将max() 方法和group by联合使用
  1. select *,max(create_time) from a
  2. where create_time<="2017-03-29 19:30:36"
  3. group by user_id
复制代码
这句可以明白为将结果集根据user_id分组,每组取time最大一条记录。如许就很好的实现了批量查询近来记录,而且仅仅必要遍历一次表,即使在数据量巨大的环境下也可以在很短的时间查出结果。
扩展:
现在有一张资产装备表:base_assets_turn
查询资产的最新保管人
注:假设资产编号   ASSETS_ID=254
下策:
  1. select * from base_assets_turn
  2. where ASSETS_ID = 254
  3. order by create_time desc
  4. limit 1
复制代码
中策:
  1. select * from ( select * from base_assets_turn
  2. where ASSETS_ID = 254
  3. order by create_time desc) tt GROUP BY tt.ASSETS_ID;
复制代码
上策:
那么上策该如何誊写呢,接待留言!

以上所述是小编给大家带来的Mysql查询近来一条记录的sql语句(优化篇),渴望对大家有所帮助,如果大家有任何疑问接待给我留言!

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作