zoukankan      html  css  js  c++  java
  • 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 (节省字段存储空间)

  • 相关阅读:
    [20190905] 考试卷子分析
    tmp
    分层图——孤岛营救
    [BNDSOJ] #1106代码
    [BNDSOJ] 小P的数列代码
    补充[BNDSOJ]小p的数列
    针对【H-2017年信息基础班(周一班)】某些同学恶意使用lyl洛谷的谴责
    #1086. 受欢迎的牛
    [sol]250OJ 1~10
    编译原理之词法分析(大三生活第21天,度过了一段萎靡的时光)
  • 原文地址:https://www.cnblogs.com/jiangweili/p/9440920.html
Copyright © 2011-2022 走看看