摘要:时间在查询后默认是顺序排列,因此需要先将时间倒序排列,方可取出距离当前最近一条。这样就很好的实现了批量查询最近记录,并且仅仅需要遍历一次表,即使在数据量巨大的情况下也可以在很短的时间查出结果。
下策——查询出结果后将时间排序后取第一条
select * from a where create_time<="2018-05-25 17:30:15" order by create_time desc limit 1
这样做虽然可以取出当前时间最近的一条记录,但是一次查询需要将表遍历一遍,对于百万以上数据查询将比较费时;
limit是先取出全部结果,然后取第一条,相当于查询中占用了不必要的时间和空间;
还有如果需要批量取出最近一条记录,比方说:“一个订单表,有用户,订单时间,金额,需要一次性查询所有用户的最近的一条订单记录”,那么每个用户一次查询就要做一次整表的遍历,数据大的情况下,时间将会以指数形式增长,不能投入实际使用。
中策——查询排序后group byselect * from ( select * from a where create_time<="2018-05-25 17:30:15" order by create_time desc ) group by user_id
后来发现使用group by 可以根据group by 的参数列分组,但返回的结果只有一条,仔细观察发现group by是将分组后的第一条记录返回。时间在查询后默认是顺序排列,因此需要先将时间倒序排列,方可取出距离当前最近一条。
这样查询实际上还是进行了两次查询,虽然时间上相比第一个方法有了质的飞跃,但是还可以进一步优化。
上策——将max() 方法和group by结合使用select *,max(create_time) from a where create_time<="2018-05-25 17:30:15" group by user_id
这句可以理解为将结果集根据user_id分组,每组取time最大一条记录。这样就很好的实现了批量查询最近记录,并且仅仅需要遍历一次表,即使在数据量巨大的情况下也可以在很短的时间查出结果。
扩展:现在有一张资产设备表:base_assets_turn
查询资产的最新保管人
注:假设资产编号 ASSETS_ID=254
下策:select * from base_assets_turn where ASSETS_ID = 254 order by create_time desc limit 1中策:
select * from ( select * from base_assets_turn where ASSETS_ID = 254 order by create_time desc) tt GROUP BY tt.ASSETS_ID;上策:
那么上策该如何书写呢,欢迎留言
by:一只阿木木
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/47759.html
摘要:如果语句中使用了子查询集合操作临时表等情况,会给列带来很大的复杂性。会递归执行这些子查询,把结果放在临时表里。查询优化器从中所选择使用的索引。该字段显示了查询优化器通过系统收集的统计信息估算出来的结果集记录条数。 引言 优化SQL,是DBA常见的工作之一。如何高效、快速地优化一条语句,是每个DBA经常要面对的一个问题。在日常的优化工作中,我发现有很多操作是在优化过程中必不可少的步骤。然...
摘要:如果语句中使用了子查询集合操作临时表等情况,会给列带来很大的复杂性。会递归执行这些子查询,把结果放在临时表里。查询优化器从中所选择使用的索引。该字段显示了查询优化器通过系统收集的统计信息估算出来的结果集记录条数。 引言 优化SQL,是DBA常见的工作之一。如何高效、快速地优化一条语句,是每个DBA经常要面对的一个问题。在日常的优化工作中,我发现有很多操作是在优化过程中必不可少的步骤。然...
摘要:如果语句中使用了子查询集合操作临时表等情况,会给列带来很大的复杂性。会递归执行这些子查询,把结果放在临时表里。查询优化器从中所选择使用的索引。该字段显示了查询优化器通过系统收集的统计信息估算出来的结果集记录条数。 引言 优化SQL,是DBA常见的工作之一。如何高效、快速地优化一条语句,是每个DBA经常要面对的一个问题。在日常的优化工作中,我发现有很多操作是在优化过程中必不可少的步骤。然...
摘要:查询子句多个字段,前可使用聚合函数,对查询后结果的筛选和后面的语法类似字段别名表别名子查询子查询结果作为父查询的表子查询子查询结果命名子查询作为字段使用子查询可以跨多个表隔离级别未提交读,可能产生脏读,不可重复读,幻读读已提交,可能产生不可 mysql 查询子句: group by 多个字段,group by 前可使用聚合函数, having: 对查询后结果的筛选 和where后...
摘要:并发虽然是必须的,但可能会导致以下的问题。事务隔离级别有哪些的默认隔离级别是标准定义了四个隔离级别读取未提交最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读幻读或不可重复读。可串行化最高的隔离级别,完全服从的隔离级别。 标题有点标题党的意思,看了文章之后希望大家不会有这个想法,绝对干货!!!这篇花文章是我花了几天时间对之前总结的MySQL知识点做了完善后的产物,这篇文章可以用...
阅读 2338·2023-04-25 18:13
阅读 531·2021-11-22 12:10
阅读 2789·2021-11-22 11:57
阅读 1988·2021-11-19 11:26
阅读 1879·2021-09-22 15:40
阅读 1282·2021-09-03 10:28
阅读 2529·2019-08-30 15:53
阅读 1767·2019-08-30 15:44