我們爲什麼要用索引,用索引爲什麼比不用索引快

今天分析客戶的oracle數據庫,發現很多表上都建立了複合索引,而SQL的執行計劃很多都沒有走索引或者都是索引掃,這顯然是不對的,通過分析SQL發現,SQL的條件很多都不滿足複合索引,也可以說是複合索引簡歷的不正確,在請教老楊(楊廷琨)之後,使我明白了很久以來一直沒有關注過也沒仔細思考過的問題,就是我們爲什麼要用索引,都說用索引會加快數據庫的速度,那麼爲什麼會加快速度呢?我想這個問題很多人都會回答因爲索引記錄了表中的ROWID,所以快,那麼在有些情況下,索引的大小甚至比表還大,全掃索引還不如全掃表呢!

      經過老楊的細心指點,我才真正的明白、理解、記住(以前曾看過索引的資料,時間長都忘啦)。

      老楊問我如果一張表上沒有索引,你要查ID=5的記錄,數據庫會怎麼做?

      我說數據庫會先根據數據字典找到這張表,然後根據表頭的記錄找到這張表的數據塊,然後每個數據塊去找。

      老楊:會把所有的數據塊都掃一遍嗎?
      我:有可能會,有可能不會。(我回答錯啦)

      老楊:那麼什麼時候會全掃?什麼時候不全掃?

      我:有可能掃第一個塊的時候就找到了ID=5的行,就不去掃其他的塊啦,也有可能掃到最後的一個塊才找到D=5的信息,就全掃啦。

      老楊:可能是我問你的問題誤導你了,我一說ID=5你就以爲ID是主鍵,那麼如果找的不是ID=5而是name=張三的呢?

      我:那樣會全掃。

      老楊:爲什麼會全掃,可能在找第一個快的時候就找到了name=張三的信息啦。

      我:因爲name=張三的行有很多重複的。

      老楊:這就對啦,如果不用索引,即使是找一條數據庫裏沒有的數據,oracle也會把表的所有塊都掃一遍,然後返回結果,索引記錄了行的信息,所以有時候我們要用索引。那麼用索引爲什麼會提高性能呢?

      老楊:因爲索引(以B樹索引爲例)是樹狀結構,最上面的是根,根下面是枝,枝再下面是葉,根會記錄比如1-20的ID在第一個枝上,21-40在第二個枝上... ... ,這樣我們找ID=5的數據,走索引的話,通過掃描根就直接去找第一個枝,通過掃描第一個枝找到所有ID=5的行的ROWID找到所有ID=5的數據。而且,索引是有序的(這也是有些時候索引會比表大的一個原因),這樣就提高了效率。

       以上不是原話,原話記不清啦,是我理解的大概意思!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章