常用索引簡介

胖子k發表於2019-04-02

引言

   提到sql效能優化,索引是最常用的手段之一,我們經常會看到create index on 表名(列名...)之類的指令碼,這就是最為常用的索引,它具有加快查詢速度的作用,當資料庫資料量大的時候,效用將會比較明顯。筆者想將索引總結分類,分類一定是按照某一種分類邏輯去分的,經查閱大量資料,發現網上很多文章基本都是按邏輯(單行索引,多行索引,函式索引等等)或者按物理空間(分割槽索引,非分割槽索引等)或者按資料結構(B樹索引,HASH索引,全文索引等)去進行分類,種類五花八門而且很多基本不常用,建立索引的目的就像建立書本的目錄一樣,查詢內容的時候先去查詢目錄再定位內容就能提高效率,而不是對書本全域性掃描,筆者在這裡總結幾種常用索引。

索引分類

主鍵索引 

   不需要手動建立,我們在建立主鍵的時候資料庫會自動加上索引

   eg:我們執行  alter table 表名 add constraint 主鍵名 primary key(列名)  後,當我們使用plsql檢視該表的建立語句時會發現建立主鍵的語句是  

常用索引簡介

我們發現資料庫確實自動給主鍵對應的列加上了索引常用索引簡介

普通索引 

     建立語句: create index 索引名 on 表名(列1,列2...列n)

     可以是單列索引,也可以是聯合索引,是B樹結構的一種

唯一索引 

     建立語句: create unique index 索引名 on 表名(列1,列2...列n)

     可以單列可以聯合,主要作用是確保單列資料或者聯合資料的唯一性,是B樹結構的一種

點陣圖索引

     建立語句: create bitmap index 索引名 on 表名(列名)

     適用範圍:基數較小,且基數值相對穩定(沒有頻繁的update)

     example: select * from table where gender=‘男’ //對gender建立點陣圖索引

     原理這篇部落格講的很清楚: https://www.cnblogs.com/LBSer/p/3322630.html,引用裡面的一句話:點陣圖索引的關鍵是縮小了儲存空間,以使得記憶體遍歷成為可能,

函式索引

     建立語句: create  index 索引名 on 表名(F(列名))

     F是資料庫中的函式,可以是系統函式,eg:to_char(), 也可以是自定義函式,自定義函式必須是deterministic修飾的常用索引簡介

       deterministic意為確定性的,即對於某一函式,當輸入引數確定後,輸出引數在任何時間一定是個確定的值,不會隨著時間發生變化,例如某個函式的功能是返回輸入值和當前系統時間組成的字串,這種函式就不是確定性函式,不滿足要求

     example: select.....from a where to_char(a.age)='15' //對to_char(age)建索引

     select.....from a where  decrypt_des(a.cert_id,'123456')='stop' //對decrypt_des(a.cert_id,'123456')建索引

  但這種函式索引較少使用,因為通常對值轉換是更好的方式,除非是一些特殊情況,例如對列做md5運算後判斷是否相等,因為非對稱加密的關係無法對值進行解密

注意事項

以上介紹的索引優化的前提條件是where 後面使用"=", 如果不使用"="而是使用一些其它的符合有可能還是會使用全域性掃描從而導致索引失效,以下列出的有一部分前者為索引失效的用法,後者為替換用法

<>  n  或者!=n   都會導致全表掃描,改為 <n or >n ;

is null,is not null  會導致全表掃描,無替換方法,最好不這樣用 ;

dept_id(varchar2,列有索引) =5 ,系統會自動對dept_id加to_number()使索引失效,改為

dept_id ='5'  ;

使用like也會導致全表掃描 ;

in,not in也會導致全表掃描,如果連續,可改為between...and...  ;

儘量不對欄位進行表示式操作,會導致全表掃描,


索引使用的大概規律

資料量較小時不需要建立索引

頻繁作為查詢條件的欄位或者作為order by欄位應該建立索引

查詢中與其他表有關聯的欄位

頻繁更新的欄位不適合建立索引,因為每次更新不單單是更新記錄,還會更新索引,儲存索引檔案

where條件裡用不到的欄位,不建立索引

查詢中排序的欄位建立索引將提高排序速度

查詢中統計或者分組的欄位



相關文章