mysql 查询优化,怎么写出高效率的sql语句

好记性不如烂笔头   后期会不断完善

  1. 主表中数据量大时,尽量避免连表查询和子查询,可以试试exists
  2. 能用exists尽量不用 in。
  3. 查询昨天和今天的数据,采用 check_time  > DATE_SUB(CURDATE(),INTERVAL 1 DAY)。
  4. 模糊匹配 使用"_%"(走索引),不使用"%_%"(不走索引)  ,判断某字段是否包含“女”,使用LOCATE, LOCATE("赣",plate_no)返回1代表包含 ,返回0代表不包含。
  5. order by housr 其中,若hour 为字符串 '1','9','5','11','13'  而不是整数 1,9,5,11,13  加上 ABS()函数,即order by ABS(hour ),否则排序顺序不对。
  6. 涉及到计算的字段,尽量方到最外层计算,这样可以减少计算量。
  7. 左右连接时,尽量多使用on 后面的条件,少使用 where 贴上代码看看对比效果,注意看注释掉的地方。
  • SELECT
       month(m1.check_time) as time,
       sum(case  when LOCATE('G',m2.road_name)>0 then m1.over_weight else 0  end)/ 1000   as overdata1,
       sum(case  when LOCATE('S',m2.road_name)>0 then m1.over_weight else 0  end)/ 1000   as overdata2
    FROM
    	vehicle_info m1
    left JOIN site_info m2 on m2.check_id=m1.check_id and m2.del_flag='0' and  m2.is_bridge!='1'
    WHERE 1=1
    -- and m2.del_flag='0' and  m2.is_bridge!='1'
    and YEAR(m1.check_time) =YEAR(NOW())
    GROUP BY time
    ORDER BY  ABS(time)

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

圈圈的博客

您的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值