如何提高sql执行效率
提高sql执行效率的方法:1.select子句中避免使用“ * ”;2.只需要一行数据时使用limit 1;3.where中尽量不要使用or;4.优化like语句;5.避免使用困难的正规表达式;6. 不要在where中包含子查询等。select子句中避免使用“ * ”,是因为select * 进行查询会造成回表查询,将会耗费更多时间。
1.select子句中避免使用“ * ”
查询SQL尽量不要使用select * ,而是select具体字段。因为select * 进行查询时,很可能就不会使用到覆盖索引了,就会造成回表查询;而只取需要的字段,可以节省资源、减少网络开销。
2.只需要一行数据时使用limit 1
如果知道查询结果只有一条或者只要最大/最小一条记录,建议用limit 1 。加上limit 1后,只要找到了对应的一条记录,就不会继续向下扫描了,效率将会大大提高。
当然,如果name是少数索引的话,是不必要加上limit 1了,因为limit的存在主要就是为了防止全表扫描,从而提高性能,如果一个语句本身可以预知不用全表扫描,有没有limit ,性能的差别并不大。
3.where中尽量不要使用or
应尽量避免在where子句中使用or来连接条件。因为,使用or可能会使索引失效,从而全表扫描。
对于or+没有索引的age这种情况,假设它走了userId的索引,但是走到age查询条件时,它还得全表扫描,也就是需要三步过程:全表扫描+索引扫描+合并如果它一开始就走全表扫描,直接一遍扫描就完事。mysql是有优化器的,处于效率与成本考虑,遇到or条件,索引可能失效,看起来也合情合理。
4.优化like语句
日常开发中,如果用到模糊关键字查询,很容易想到like,但是like很可能让你的索引失效。理由是:把%放前面,并不走索引;把% 放关键字后面,还是会走索引的。
5.避免使用困难的正规表达式
避免使用困难的正规表达式,例如select * from customer where zipcode like “98___”,即便在zipcode上建立了索引,在这种情况下也还是采用顺序扫描的方式。如果把语句改成select * from customer where zipcode>”98000″,在执行查询时就会利用索引来查询,显然会大大提高速度。
6. 不要在where中包含子查询
关于时间的查询,尽量不要写成:where to_char(dif_date,’yyyy-mm-dd’)=to_char(’2007-07-01′,’yyyy-mm-dd’)。
7.where子句中使用默认值代替null
并不是说使用了is null 或者 is not null 就会不走索引了,这个跟mysql版本以及查询成本都有关。如果mysql优化器发现,走索引比不走索引成本还要高,肯定会放弃索引,这些条件!=,>is null,is not null经常被认为让索引失效,其实是因为一般情况下,查询的成本高,优化器自动放弃的。
如果把null值,换成默认值,很多时候让走索引成为可能,同时表达意思会相对清晰一点。
8.删除冗余和重复索引
重复的索引需要维护,并且优化器在优化查询的时候也需要逐个地进行考虑,这会影响性能的。
9.通过内部函数提高SQL效率
复杂的SQL往往牺牲了执行效率。能够掌握上面的运用函数解决问题的方法在实际工作中是非常有意义的。
10.尽量使用数字型字段
尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型。相对于数字型字段,字符型会降低查询和连接的性能,并会增加存储开销。
除上述方法外,还有很多小技巧可以提高sql执行效率,例如:不要有超过5个以上的表连接;索引尽量不超过五个;用Where子句替换HAVING子句;用EXISTS替代IN、用NOT EXISTS替代NOT IN。
延伸阅读
sql语句的执行顺序是什么
sql执行顺序优先级由高到低依次是:from关键字后面的语句、where关键字后面的语句、“group by”后面的语句、select后面的语句、“order by”后面的语句。
1. from字句
执行from关键字后面的语句,明确数据的来源,它是从哪张表取来的。执行顺序为从后往前、从右到左,数据量较大的表尽量放在后面。
2. where字句
执行where关键字后面的语句,对数据进行筛选。执行顺序为自下而上、从右到左,将能过滤掉最大数量记录的条件写在where字句的最右。
3.group by字句
执行group by后面的语句,对数据进行分组分类。执行顺序从右往左分组,较好在group by前使用where将不需要的记录在group by之前过滤掉。
4.select字句
执行select后面的语句,也就是对处理好的数据,具体要取哪一部分。
5.order by字句
执行order by后面的语句,对最终的结果进行排序。执行顺序从左到右,消耗资源。

