天天看點

資料庫優化

、 資料庫優化方案(百萬級資料量)

  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 ,用具體的字段清單代替“*”,不要傳回用不到的任何字段。

資料庫優化