数据库优化

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

  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 ,用具体的字段列表代替“*”,不要返回用不到的任何字段。

原文地址:https://www.cnblogs.com/ITPower/p/9176502.html