sqlin⼀万条数据_好程序员⼤数据解析SQL优化⽅案精解⼗则好程序员⼤数据解析 SQL优化⽅案精解⼗则,转眼间我的⼤数据培训课程的第⼆阶段的学习就要结束,在好程序员的这⼀个⽉⾥我和各位同学学到了很多新的知识,SQL优化是对数据库操作效率提⾼的重要课题,因此先直⼊正题,与⼤家分享⼏个常⽤的,但容易忽视的⼏个SQL优化⽅案如下:
⼀、避免进⾏null判断
应尽量避免在 where ⼦句中对字段进⾏ null 值判断,否则将导致引擎放弃使⽤索引⽽进⾏全表扫描,这⾥最好不要给数据库留NULL,尽可能的使⽤ NOT NULL填充数据库。
备注、描述、评论之类的可以设置为 NULL,最好不要使⽤NULL。不要错误的认为NULL 不需要空间,如char(100) 型,在字段建⽴时,空间就固定了。不管是否插⼊值(NULL也包含在内),都是占⽤ 100个字符的空间的,如果是varchar这样的变长字段, null 不占⽤空间。可以在num上设置默认值0,确保表中num列没有null值。
⼆、不要使⽤select *
使⽤select *的话会增加解析的时间,另外也会把不需要的数据同时查询出来,从⽽延长数据传输时间,耗费精⼒。如text类型的字段,通常⽤来保存⼀些内容⽐较繁杂的东西,如果使⽤select *,则会把该字段也查询出来。
三、谨慎使⽤模糊查询
sql优化的几种方式当模糊匹配以%开头时,该列索引将失效。若不以%开头,该列索引有效。
四、不要使⽤列号
使⽤列号的话,将会增加不必要的解析时间。
五、优先使⽤UNION ALL,避免使⽤UNION
因为UNION 会将各查询⼦集的记录做⽐较,故⽐起UNION ALL ,通常速度都会慢上许多。⼀般来说,如果使⽤UNION ALL能满⾜要求的话,务必使⽤UNION ALL。还有⼀种情况,如果业务上能够确保不会出现重复记录。
六、在where语句或者order by语句中避免对索引字段进⾏计算操作
当在索引列上进⾏操作之后,索引将会失效。正确做法应该是将值计算好再传⼊进来。
七、使⽤not exist代替not in
如果查询语句使⽤了not in 那么内外表都进⾏全表扫描,没有⽤到索引;⽽not extsts 的⼦查询依然能⽤到表上的索引。
⼋、exist和in的区别
in 是把外表和内表作hash 连接,⽽exists是对外表作loop循环,每次loop循环
再对内表进⾏查询。因此,in⽤到的是外表的索引, exists⽤到的是内表的索引。如果查询的两个表⼤
⼩相当,那么⽤in和exists差别不⼤。如果两个表中⼀个较⼩,⼀个是⼤表,则⼦查询表⼤的⽤exists,⼦查询表⼩的⽤in。
九、避免在索引列上做如下操作
1.避免在索引列上使⽤IS NULL和IS NOT NULL。
2.避免在索引列上出现数据类型转换。(⽐如某字段是String类型,参数传⼊时是int类型)当在索引列上使⽤如上操作时,索引将会失效,造成全表扫描。
⼗、复杂操作可以考虑适当拆成⼏步
有时候会有通过⼀个SQL语句来实现复杂业务的例⼦出现,为了实现复杂的业务,嵌套多级⼦查询。造成SQL性能问题。对于这种情况可以考虑拆分SQL,通过多个SQL语句实现,或者把部分程序能完成的⼯作交给程序完成。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论