資料庫中,索引的作用?為什麼能夠提高查詢速度?(索引的原理)
阿新 • • 發佈:2018-12-27
為什麼能夠提高查詢速度?
索引就是通過事先排好序,從而在查詢時可以應用二分查詢等高效率的演算法。
一般的順序查詢,複雜度為O(n),而二分查詢複雜度為O(log2n)。當n很大時,二者的效率相差及其懸殊。
舉個例子:
表中有一百萬條資料,需要在其中尋找一條特定id的資料。如果順序查詢,平均需要查詢50萬條資料。而用二分法,至多不超過20次就能找到。二者的效率差了2.5萬倍!
在一個或者一些欄位需要頻繁用作查詢條件,並且表資料較多的時候,建立索引會明顯提高查詢速度,因為可由全表掃描改成索引掃描。
(無索引時全表掃描也就是要逐條掃描全部記錄,直到找完符合條件的,索引掃描可以直接定位)
不管資料表有無索引,首先在SGA的資料緩衝區中查詢所需要的資料,如果資料緩衝區中沒有需要的資料時,伺服器程序才去讀磁碟。
1、無索引,直接去讀表資料存放的磁碟塊,讀到資料緩衝區中再查詢需要的資料。
2、有索引,先讀入索引表,通過索引表直接找到所需資料的實體地址,並把資料讀入資料緩衝區中。
索引有什麼副作用嗎?
(1)索引是有大量資料的時候才建立的,沒有大量資料反而會浪費時間,因為索引是使用二叉樹建立.
(2)當一個系統查詢比較頻繁,而新建,修改等操作比較少時,可以建立索引,這樣查詢的速度會比以前快很多,同時也帶來弊端,就是新建或修改等操作時,比沒有索引或沒有建立覆蓋索引時的要慢。
(3)索引並不是越多越好,太多索引會佔用很多的索引表空間,甚至比儲存一條記錄更多。
對於需要頻繁新增記錄的表,最好不要建立索引,沒有索引的表,執行insert、append都很快,有了索引以後,會多一個維護索引的操作,一些大表可能導致insert 速度非常慢。