首页 > 数据库 >mysql 查询当天过生日sql

mysql 查询当天过生日sql

时间:2023-01-09 17:11:22浏览次数:41  
标签:02 03 00 09 t1 sql mysql 过生日 id

             线上发现有这么一个慢sql:查询当天生日的用户,由于用户量达到了百万级,原来的慢sql如下:

            

select t1.id as id, t1.user_name, t1.real_name, t1.user_id as userid,
t1.xinge_token as xingetoken , t1.sex as sex, t1.register_time as registertime
from user_detail t1
where t1.source_app = 'ORA' and t1.is_enable = 1

and date_format(t1.birthday, '%m-%d') =
date_format('1987-09-03 00:00:00', '%m-%d') and t1.is_enable = 1

  

 

   使用执行计划,发现竟然全表扫描了:原因是使用了date_format库

    

 

 

 

   于是思考如何去优化这个慢sql,百度知乎,发现有类似的函数:

    DAYOFYEAR、WEEKOFYEAR,具体就是查询一年中的第多少天以及第多少周的。但是发现一个奇怪的现象是: 如果查询只查询生日一个字段,会很快,但是如果带上比如id、name之类的,

立马就慢了一个数量级。

 

 

 

 

select t1.birthday
from user_detail t1
where t1.source_app = 'ORA' and t1.is_enable = 1
and DAYOFYEAR(t1.birthday )=DAYOFYEAR("2022-09-03");

 

 

 

 

   

     

 

 

 

 

     0.4秒多,如果带上id的条件:

  

select t1.birthday,t1.user_id
from user_detail t1
where t1.source_app = 'ORA' and t1.is_enable = 1
and DAYOFYEAR(t1.birthday )=DAYOFYEAR("1930-09-03");

 

 

 

 

 大概是7S多,查了10几倍了。

 于是优化就改为了,先根据日期查询当天的具体的生日,再用这个为条件,去sql过滤查询。这样就快多了

select t1.id as id, t1.user_name, t1.real_name, t1.user_id as userid,
t1.xinge_token as xingetoken , t1.sex as sex, t1.register_time as registertime
from user_detail t1
where t1.source_app = 'ORA' and t1.is_enable = 1
and t1.birthday in ('1903-09-03 00:00:00','1911-09-03 00:00:00','1919-09-03 00:00:00','1945-09-03 00:00:00','1958-09-03 00:00:00','1961-09-03 00:00:00','1962-09-03 00:00:00','1964-09-02 00:00:00','1965-09-03 00:00:00','1967-09-03 00:00:00','1967-09-03 00:00:00','1968-09-02 00:00:00','1968-09-02 00:00:00','1968-09-02 00:00:00','1968-09-02 00:00:00','1969-09-03 00:00:00','1969-09-03 00:00:00','1969-09-03 00:00:00','1969-09-03 00:00:00','1970-09-03 00:00:00','1970-09-03 00:00:00','1971-09-03 00:00:00','1972-09-02 00:00:00','1972-09-02 00:00:00','1972-09-02 00:00:00','1972-09-02 00:00:00','1973-09-03 00:00:00','1975-09-03 00:00:00','1975-09-03 00:00:00','1976-09-02 00:00:00','1977-09-03 00:00:00','1977-09-03 00:00:00','1977-09-03 00:00:00','1977-09-03 00:00:00','1977-09-03 00:00:00','1978-09-03 00:00:00','1978-09-03 00:00:00','1979-09-03 00:00:00','1979-09-03 00:00:00','1979-09-03 00:00:00','1979-09-03 00:00:00','1979-09-03 00:00:00','1979-09-03 00:00:00','1979-09-03 00:00:00','1979-09-03 00:00:00','1979-09-03 00:00:00','1980-09-02 00:00:00','1980-09-02 00:00:00','1980-09-02 00:00:00','1980-09-02 00:00:00','1980-09-02 00:00:00','2022-09-03 14:32:49');

 

 

 

 

  具体为何查询生日很快,但是加一个字段为何这么快呢?

      

标签:02,03,00,09,t1,sql,mysql,过生日,id
From: https://www.cnblogs.com/thinkingandworkinghard/p/17037608.html

相关文章

  • MyBatis的动态SQL详解
    MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑。MyBatis中用于实现动态SQL的元素主要有:ifchoose(when,otherwise)trimwheresetforeach......
  • Sqli-labs三个注入关卡【1、5、11】
    常见手动注入闭合方式or1=1;'or1=1;"or1=1;)or1=1;')or1=1;")or1=1;"))or1=1;也可以是使用”\”转义字符,通过转义字符将闭合方式爆出常见符号十六进制表示0x3A:0x68h......
  • MyBatis:动态SQL
    目录动态SQL介绍搭建环境if语句WhereSetchoose语句SQL片段Foreach总结动态SQL介绍动态SQL指的是根据不同的查询条件,生成不同的Sql语句.官网描述:MyBatis的强大特......
  • AZ-500 Lab-configure SQL Server network access
    由于微软Azure平台界面一直都在变,所以通过考试的关键,是真正理解lab题要表达的意思,不要死记硬背。SIMULATION-YouneedtoconfigureaMicrosoftSQLservernamedWeb1234......
  • MySQL23 - SQL优化
    SQL优化插入数据批量插入插入多条数据时,执行批量插入,但批量插入也不建议插入超过1k条几百万数据时,多次批量插入INSERTINTOtable_nameVALUES(..)(..)(........
  • MySQL统计一个数据库中所有表的数据量
    mysql统计一个数据库里所有表的数据量,最近在做统计想查找一个数据库里基本所有的表数据量,数据量少的通过selectcount再加起来也是可以的,不过表的数据有点多,不可能一个一个......
  • 项目中统计SQL执行缓慢的方案-数据预处理
    使用场景:由于表数据量巨大,导致一些统计相关的sql执行非常慢,使用户有非常不好的体验,并且sql和数据库已经没有优化空间了。(并且该统计信息数据实时性要求不高的前提下)解......
  • SQL211 获取当前薪水第二多的员工的emp_no以及其对应的薪水salary
    SQL211获取当前薪水第二多的员工的emp_no以及其对应的薪水salary题目描述有一个薪水表salaries请你获取薪水第二多的员工的emp_no以及其对应的薪水salary,若有多个员工......
  • MySQL22 - SQL性能分析
    SQL性能分析SQL执行频率通过SHOW[SESSION|GLOBAL]STATUS命令可以提供服务器状态信息,通过以下指令可以查看当前数据库的INSERT、UPDATE、DELETE、SELECT的访问频......
  • MySQL21 - 索引
    索引什么是索引索引相当于一本书的目录,为了缩小扫描范围而存在、提高查询效率的一种数据结构一张表的一个字段可以添加索引,多个字段也可以联合起来添加索引在任何数据......