1. 程式人生 > >索引深入理解索引提高查詢速度的原因

索引深入理解索引提高查詢速度的原因

1.索引是什麼
index索引是幫助資料庫高效獲取資料的資料結構。  是1種資料結構

2.引入索引
無論是資料庫查詢資料,還是其他的程式查詢資料利用到的查詢資料必定涉及到相關的查詢演算法。
引入:如資料結構的順序表中獲取順序資料一般地我們採用for迴圈來查詢資料此演算法的複雜度為o(n)           (可查閱演算法複雜度說明)
如果在查詢大量的資料是這種演算法的效率很低,還好有二分法來取順序的資料效率提高。
然而資料庫的資料必然不可能是順序的資料,存放資料我不一定要使用順序表,在資料結構中有很多的資料結構,因此資料結構的誕生就是為了
配合相關的演算法解決我們開計算機程式設計中遇到的效能和效率問題。而索引這種資料結構就是為了資料庫資料查詢的效率而誕生的資料結構


3.索引的底層資料結構是什麼
現在資料庫索引普遍使用的資料結構是 b+tree  oracle提供了很多種索引實現包括  b+tree索引、點陣圖索引、函式索引、應用域索引、hash索引、分割槽索引


4.  索引的建立和刪除


CREATE INDEX index_name ON table_name (column_list)


DROP INDEX index_name ON talbe_name

5.索引的誤區

1.建立索引了可能oracle並沒有用到索引
oracle的statistics沒有做相關的配置或者statistics很久了
2.oracle判斷索引效率比全盤掃描的效率低
oracle在評估是否使用索引時會參考CF和FF兩個資料
CF(Clustering Factor):
主要是通過rowid來體現的,rowid是oracle的隱藏欄位
通過判斷rowid的儲存位置來判斷CF的大小 
CF的值越大,說明資料的rowid指向的資料塊越多,要讀這些資料會讀對應的資料塊,I/O的讀取次數很多。
CF值越小,說明資料的rowid指向的資料塊越少,讀取資料時I/O的讀取次數會很少。
因此CF值越大說明效率越低
在查詢資料時,Orale會比較資料的rowid,如果這兩個rowid不屬於同一個資料塊,那麼cluster factor增加1;
如果CF的值接近資料塊的值 那說明該表的資料是按索引方式存取的 
如果CF的值接近資料行的值,說明該表的資料不是按索引存取的

FF(Filtering factor)
sql語句所選擇的結果集佔總的資料量的百分比
通過Selectivity來理解
表示一個行集當中的一小部分行這個行集可以是基表,檢視,或者一個join的結果集,或者一次group by操作
選擇性受限於查詢謂詞,比如,last_name='Smith',或者一個聯合謂詞,比如,last_name='Smith' ADN job_type='Clerk'
一個謂詞就像一個過濾器,從行集當中過濾掉某些行

通過oracle優化的相關演算法來判斷當前的語句使用索引是否合適

3.
  索引不是越多越好
特別是大量從來或者幾乎不用的索引,對系統只有損害。OLTP系統每表超過5個索引即會降低效能。
單列索引不如複合索引有效率。
用於多表連結的欄位,加上索引會很有作用。
4.對於頻繁做新增刪除操作的表在有一定的資料量之後要重建索引
以前的索引結構已經不適合這種量級資料,反而會降低效率