SQL语句的优化

文章讨论了SQL查询中的limit子句使用、避免NULL值判断的最佳实践,强调了统一SQL语句格式的重要性。还讲解了索引对查询性能的影响,包括创建、使用和数量限制,以及如何通过存储过程、执行计划和优化策略提高代码执行效率。
摘要由CSDN通过智能技术生成
  1. 使用limit子句限制返回的数据行数如果前台只需要显示15行数据,而你的查询结果集返回了1万行,那么这适合最好使用limit子句来限制查询返回的数据行数。
  2. 应尽量避免在where子句中对字段进行null值判断,创建表时NULL是默认值,但大多数时候应该使用NOT NULL,或者使用一个特殊的值,如0,-1作为默认值。
  3. 统一SQL语句的写法对于以下两句SQL语句,程序员认为是相同的,数据库查询优化器认为是不同的。select * rom dualselect * From dual其实就是大小写不同,查询分析器就认为是两句不同的SQL语句,必须进行两次解析。生成2个执行计划。所以作为程序员,应该保证相同的查询语句在任何地方都一致,多一个空格都不行!
  4. 删除重复记录最高效的删除重复记录方法(因为使用了ROWID)例子:DELETE FROM EMP E WHERE E.ROWID >(SELECT MIN(X.ROWID) FROM EMP X WHEREX.EMP_NO = E.EMP_NO);
  5. 下面的查询也将导致全表扫描:select id from t where name like‘%abc%’或者select id from t where name like‘%abc’若要提高效率,可以考虑全文检索。而select id from t where name like‘abc%’才用到索引。
  6. 索引固然可以提高相应的select的效率,但同时也降低了insert及update的效率,因为insert或update时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。
  7. 用OR的字句可以分解成多个查询,并且通过UNION 连接多个查询。他们的速度只同是否使用索引有关,如果查询需要用到联合索引,用UNION all执行的效率更高。多个OR的字句没有用到索引,改写成UNION的形式再试图与索引匹配。一个关键的问题是否用到索引。
  8. 尽量将数据的处理工作放在服务器上,减少网络的开销,如使用存储过程。存储过程是编译好、优化过、并且被组织到一个执行规划里、且存储在数据库中的SQL语句,是控制流语言的集合,速度当然快。反复执行的动态SQL,可以使用临时存储过程,该过程(临时表)被放在Tempdb中。
  9. 优化优化再优化一切都做好了,就等代码执行了,然而执行过程一等少则几分钟,多着几个小时,这样的代码估计没人敢用吧。而SQL非常讲究效率,有时0.01秒的等待可能都会造成蝴蝶效应,久而久之,最终导致死锁或异常。这个时候就需要我们,对自己写的SQL代码好好的优化一番,而SQL优化的根本就在于执行计划。通过执行计划给出合理的优化方法,不管是建索引,还是改代码,这都是我们向高质量SQL更进一步的有效措施。
  10. 用整型设计索引以整型设计的索引,字节占用少,相对与字符串索引要快的多。比如,在设计日期时候,可以用 int 类型取代 char 类型,于是日期就会变成:20200905。
  11. 尽量select具体字段;
  12. 优化limit分页,limit 10000 10很慢。例如:(1)order by + 索引;(2)业务中限制页数;
  13. where 条件尽量限制住,不要返回不符合业务的多余数据;
  14. 索引字段尽量不要参与mysql内置函数 或者 其他表达式计算;
  15. 表连接优先考虑内连接,如果是left join,应该小表驱动大表;
  16. 尽量where条件少用 != ;
  17. 组合索引时,注意索引列的顺序,遵循最左匹配原则;
  18. 如果要插入的数据过多,尽量批量保存;
  19. 慎用distinct关键字,当过多字段时,distinct多个字段sql将很慢;
  20. 当in后面数据量过大时,应该考虑用exists关键字来实现;
  21. 表连接时,尽量写别名,查询字段也用“别名.”的方式;
  22. 尽量varchar代替char,除非字段全是固定个字符;
  23. 字符串一定要用“”引起来;
  24. 经常使用explain分析你的sql语句
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值