sql优化初级

目标:逼近数据库理论上的瓶颈

1、写明具体查询某几列,减少*的使用,表明过长时候,尽量使用表的别名

2、在业务密集型的sql中尽量不采用IN操作符,用EXISTS方案代替

  in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理。

  in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。

3、模糊查询like,尽量少用%

  关键词%yue%,由于yue前面用了“%”,因此查询必然走全表扫描,除非必要,否在不要在关键词加%

4、二者都使用使用where(与having比较)

  where先过滤,(数据就少了)在分组

5、尽量使用多表连接(join)查询(避免子查询)

  子查询效率特别低,而一般的子查询都可以由关连查询来实现相同的功能,关联查询的效率要提高很多,所以建议在数据查询时避免使用子查询(尤其是在记录很多时),而最好用关联查询来实现。

6、建立索引

  较频繁的作为查询条件的字段,唯一性不太差的字段建立索引,更新不太频繁的字段适合创建索引,不会出现在where条件正的字段不该建立索引

7、多实用内部函数提高sql效率

  例如多用concat连接,代替“||”的符合连接

8、应尽量避免在where字句中使用!=或者<>,in 或 not in

  最好不要给数据库刘null,尽可能的使用not null 填充数据库,(不然会进行全盘扫描,影响效率)

9、尽可能的使用varchar/nvachar 代替 char/nchar (节省字段存储空间)

posted on 2018-08-08 09:35  姜伟  阅读(76)  评论(0编辑  收藏  举报

导航