天天看點

使用索引為什麼能提高查詢速度?

作者:big_foot

為什麼能夠提高查詢速度?

索引就是通過事先排好序,進而在查找時可以應用二分查找等高效率的算法。

一般的順序查找,複雜度為O(n),而二分查找複雜度為O(log2n)。當n很大時,二者的效率相差及其懸殊。

舉個例子:

表中有一百萬條資料,需要在其中尋找一條特定id的資料。如果順序查找,平均需要查找50萬條資料。而用二分法,至多不超過20次就能找到。二者的效率差了2.5萬倍!

在一個或者一些字段需要頻繁用作查詢條件,并且表資料較多的時候,建立索引會明顯提高查詢速度,因為可由全表掃描改成索引掃描。

(無索引時全表掃描也就是要逐條掃描全部記錄,直到找完符合條件的,索引掃描可以直接定位)

不管資料表有無索引,首先在SGA的資料緩沖區中查找所需要的資料,如果資料緩沖區中沒有需要的資料時,伺服器程序才去讀磁盤。

1、無索引,直接去讀表資料存放的磁盤塊,讀到資料緩沖區中再查找需要的資料。

2、有索引,先讀入索引表,通過索引表直接找到所需資料的實體位址,并把資料讀入資料緩沖區中。

索引有什麼副作用嗎?

  • 索引是有大量資料的時候才建立的,沒有大量資料反而會浪費時間,因為索引是使用二叉樹建立.
  • 當一個系統查詢比較頻繁,而建立,修改等操作比較少時,可以建立索引,這樣查詢的速度會比以前快很多,同時也帶來弊端,就是建立或修改等操作時,比沒有索引或沒有建立覆寫索引時的要慢。
  • 索引并不是越多越好,太多索引會占用很多的索引表空間,甚至比存儲一條記錄更多。

對于需要頻繁新增記錄的表,最好不要建立索引,沒有索引的表,執行insert、append都很快,有了索引以後,會多一個維護索引的操作,一些大表可能導緻insert 速度非常慢。