唯一索引和普通索引效能比較

2021-09-26 23:09:51 字數 1209 閱讀 8957

前提條件 有乙個資料列不會有重複資料現在需要選擇建立索引,我們應該如何去選擇呢?

1.普通索引

查詢時,遇第乙個不符合條件的才返回。

更新時,找到位置直接更新

2.唯一性索引

查詢時,遇到第乙個符合條件的直接返回。

更新時,先查詢是否唯一,再找到位置然後再更新。

我們來通過底層分析一下:

select:

我們都知道乙個索引就是建立乙個b+樹,如果他是乙個普通索引我們現在去查詢,當查詢到符合的資料的時候這個時候他就會在進行第二次查詢,因為列裡面的資料是唯一的,所以第二次查詢肯定是沒有資料的,這一次查詢通過二分法去查詢b+樹查詢到二叉樹的葉子結點,每個葉子結點都會對應乙個資料塊(資料頁),如果這個資料頁在記憶體中那麼他也就不用去在磁碟或硬碟去讀區這個資料了,直接在記憶體中讀取,我們也知道乙個資料塊大概是可以儲存幾千條資料的,所以在第一次查詢的時候剛好這個資料塊的尾部,在進行第二次查詢的時候就要在進行io讀取了 一次io讀取是很低效的。但是如果是唯一索引的話這樣的話就不會再進行第二次讀取了,所以在最壞的情況下,普通索引和唯一索引的最大區別是多進行一次io讀取,概率極小。

update:

2.在update或者insert的時候普通索引也就是去在b+ 樹中去找位置然後按照b+樹的演算法結構更新放入 或者更新其結構(拓展:在建立索引的時候會降低更新和插入效率,因為b+樹在某種情況下新增結點效率會比較低),這在innodb中如果說是在記憶體中沒有這個資料塊那麼在這個情況下他不會去現在就去更新,會將這個更新操作儲存在changebuffer上,當第二次有查詢這個資料的時候再去讀取這個資料塊然後再執行這個changebuffer 中的資料操作,meger 這個資料。(在redlog裡面也會存乙份,也會儲存changebuffer的才運算元據,es(elaticsearch)的一種同步方式是通過redo log 來進行是實時同步的),當唯一索引進行更新操作的時候 會先進行一次查詢是否唯一,再進行和普通索引一樣的操作。所以在符合業務邏輯和無誤的前提下:唯一索引比普通索引多乙個查詢操作。(在進行insert的時候會根據主鍵來進行查住 主鍵索引的資料結構發生改變)

通過上面的描述: 在符合業務場景的前提下的時候唯一索引還是少用多用用普通索引。 還有就是change buffer的使用 在更新讀取少的 情況下放大change buffer的儲存量 因為chanbuffer量越大其變更的數量更多 減少的io次書更多,效能也就提高了。

MySQL 普通索引 唯一索引和主索引

1 普通索引 普通索引 由關鍵字key或index定義的索引 的唯一任務是加快對資料的訪問速度。因此,應該只為那些最經常出現在查詢條件 wherecolumn 或排序條件 orderbycolumn 中的資料列建立索引。只要有可能,就應該選擇乙個資料最整齊 最緊湊的資料列 如乙個整數型別的資料列 來...

MySQL 普通索引 唯一索引和主索引

1.普通索引 普通索引 由關鍵字key或index定義的索引 的唯一任務是加快對資料的訪問速度。因此,應該只為那些最經常出現在查詢條件 where column 或排序條件 order by column 中的資料列建立索引。只要有可能,就應該選擇乙個資料最整齊 最緊湊的資料列 如乙個整數型別的資料...

MySQL 普通索引 唯一索引和主索引

1 普通索引 普通索引 由關鍵字key或index定義的索引 的唯一任務是加快對資料的訪問速度。因此,應該只為那些最經常出現在查詢條件 wherecolumn 或排序條件 orderbycolumn 中的資料列建立索引。只要有可能,就應該選擇乙個資料最整齊 最緊湊的資料列 如乙個整數型別的資料列 來...