什麼情況下需要建立索引? 索引的作用?為什麼能夠提高查詢速度?(索引的原理) 索引有什麼副作用嗎?

aFakeProgramer發表於2018-08-21

https://www.cnblogs.com/Berryxiong/p/6249427.html

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

索引就是通過事先排好序,從而在查詢時可以應用二分查詢等高效率的演算法。
一般的順序查詢,複雜度為O(n),而二分查詢複雜度為O(log2n)。當n很大時,二者的效率相差及其懸殊。

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

 

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

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

 

不管資料表有無索引,首先在SGA的資料緩衝區中查詢所需要的資料,如果資料緩衝區中沒有需要的資料時,伺服器程式才去讀磁碟。
1、無索引,直接去讀表資料存放的磁碟塊,讀到資料緩衝區中再查詢需要的資料。
2、有索引,先讀入索引表,通過索引表直接找到所需資料的實體地址,並把資料讀入資料緩衝區中。

 

索引有什麼副作用嗎?

(1)索引是有大量資料的時候才建立的,沒有大量資料反而會浪費時間,因為索引是使用二叉樹建立.

(2)當一個系統查詢比較頻繁,而新建,修改等操作比較少時,可以建立索引,這樣查詢的速度會比以前快很多,同時也帶來弊端,就是新建或修改等操作時,比沒有索引或沒有建立覆蓋索引時的要慢。

(3)索引並不是越多越好,太多索引會佔用很多的索引表空間,甚至比儲存一條記錄更多。
對於需要頻繁新增記錄的表,最好不要建立索引,沒有索引的表,執行insert、append都很快,有了索引以後,會多一個維護索引的操作,一些大表可能導致insert 速度非常慢。

 

提高查詢速度,有利於排序和分組. (排序和分組如用不上索引,則會產生臨時表和filesort的過程)

根據業務邏輯,分析列查詢的頻度和順序, 建立索引和複合索引.

主鍵索引(primary key), ---->不需要有索引名,因為只有一個主鍵索引

唯一索引(unique key)

---->unique key email(email(10))

括號裡面是表欄位,外面是索引名字,其他索引一樣

裡面的10是指索引的長度,如1234567899@qq.com,只取出了前面10個字元做索引

普通索引(key),

全文索引(fulltext key)--->中文環境下基本無效,一般用第三方方案如sphinx(中文分詞)

多列索引:key xm(xing,ming)用xing和ming兩個欄位做索引

冗餘索引:在某個欄位上有多個索引,如 key xm(xing,ming) ,key m(ming),有兩個 就是冗餘索引

 

相關文章