zoukankan      html  css  js  c++  java
  • 数据库优化

    、 数据库优化方案(百万级数据量)

      1. 对sql语句进行优化, 首先对where和order by涉及的列加索引。

      2.索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有 必要。

      3. 尽量在sql中避免以下几种情况, 否则会导致索引失效。

      • 尽量避免在where子句中进行null值判断,
        select id from t where num is null

        数据库中的值尽量保证都是非空的。备注、描述、评论之类的可以设置为 NULL,其他的,最好不要使用NULL。不要以为 NULL 不需要空间,比如:char(100) 型,在字段建立时,空间就固定了, 不管是否插入值(NULL也包含在内),都是占用 100个字符的空间的,如果是varchar这样的变长字段, null 不占用空间。可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:

        select id from t where num = 0
      •  尽量避免在索引列使用 != 或 <> 操作符, 
      • 尽量避免使用 or 来连接条件. 
        select id from t where num=10 or Name = 'admin'

        最好替换为union join

        select id from t where num = 10 union allselect id from t where Name = 'admin'
      • 尽量不使用 in 和 not in
        select id from t where num in(1,2,3) 

        替代方案:使用between

        select id from t where num between 1 and 3

        或者exist

        select num from a where num in(select num from b)  

        替换为

        select num from a where exists(select 1 from b where num=a.num)  
      • 尽量避免使用like 
        select id from t where name like ‘%abc%’  

         这里由于通配符(%)在搜寻词首出现,所以Oracle系统不使用last_name的索引。在很多情况下可能无法避免这种情况,但是一定要心中有底,通配符如此使用会降低查询速度。然而当通配符出现在字符串其他位置时,优化器就能利用索引。在下面的查询中索引得到了使用:

        select * from employee where last_name like 'c%';
      • 尽量避免在 where子句中对字段进行表达式操作
        select id from t where num/2 = 100

        应该为

        select id from t wherenum = 100*2
      • 采用UNION ALL操作符替代UNION

        UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。如:

        select * from gc_dfys
        union
        select * from ls_jg_dfys

        这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。

        推荐方案:采用UNION ALL操作符替代UNION,因为UNION ALL操作只是简单的将两个结果合并后就返回。

        select * from gc_dfys
        union all
        select * from ls_jg_dfys
      • fa

      4. 使用连接(JOIN)来代替子查询

      5. count(*)和count(列) 哪个更快? 其实没有可比性. 看这篇文章https://www.cnblogs.com/Caucasian/p/7041061.html

      6. 尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连 接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。

      7. 尽可能的使用 varchar/nvarchar代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。

      8.任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。

  • 相关阅读:
    由于信号量apache启动问题
    argument list too long
    Read-only file system处理
    fuser
    strace命令基本用法
    c++ 对vector和deque进行逆序排序问题
    C++ 遍历vector容器的三种方式
    C++ 中关于重复读取ifstream中的内容所需要注意的问题
    C++中的文件写入和读取(文本文件方式,二进制方式)
    Unity DoTween插件 在代码中改变Ease(运动方式)
  • 原文地址:https://www.cnblogs.com/ITPower/p/9176502.html
Copyright © 2011-2022 走看看