在项目中,同样的一个执行结果,因为不同的写法执行的效率可能将是几十倍之差,为大家罗列一下我知道关于sql优化的部分知识。
- 如果一条sql执行时间过长,那么可以查看这条sql是否涉及到了多表联合查询以及子查询,能否进行业务拆分或者建立临时表。
- 适当的建立索引将有助于提高sql查询执行效率,但是索引的增加会影响此表插入和更新效率,只需要在关键字段添加索引即可。
- 在设计表的时候,如果某一个字段能确定只是数字类型信息,那么不要设计成varchar,因为引擎在处理查询和连接时,会逐个去比较字符串每一个字符,增加存储开销,降低性能。
- 尽量不要使用星号,因为星号是会依次转化所有列名,耗费更多时间,我们只需要获取所需精确信息即可,不需要信息不要查询出来。
- in和exists在子查询中,如果主表较大且有索引用in,反之如果子表较大且有索引用exists。
- 当sql语句中存在多个or时,建议使用union all来代替,提高速度。or无法优化,但是union all可以走索引。
- 模糊查询通配符在使用的时候要注意,%c%这种写法是不会有索引效果的,当通配符出现在其他位置(c%),优化器就能利用索引,提高查询效率。
- order by语句的使用将查询结果返回并排序,但是order by语句中的无索引字段或表达式都将降低查询速度。
- where子句的连接是基于自上而下的顺序解析的,所以表之间的连接必须写在where条件之前。
- 可以适当整合简单无关联的数据访问语句,减少对数据库的访问次数。