好记性不如烂笔头 后期会不断完善
- 主表中数据量大时,尽量避免连表查询和子查询,可以试试exists。
- 能用exists尽量不用 in。
- 查询昨天和今天的数据,采用 check_time > DATE_SUB(CURDATE(),INTERVAL 1 DAY)。
- 模糊匹配 使用"_%"(走索引),不使用"%_%"(不走索引) ,判断某字段是否包含“女”,使用LOCATE, LOCATE("赣",plate_no)返回1代表包含 ,返回0代表不包含。
- order by housr 其中,若hour 为字符串 '1','9','5','11','13' 而不是整数 1,9,5,11,13 加上 ABS()函数,即order by ABS(hour ),否则排序顺序不对。
- 涉及到计算的字段,尽量方到最外层计算,这样可以减少计算量。
- 左右连接时,尽量多使用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)