mysql 7 普通索引與唯一索引的選擇

2021-10-16 12:10:21 字數 1987 閱讀 8022

普通索引: 唯一任務是加快對資料的訪問速度,因此,應該只為那些最經常出現在查詢條件(where column=)或者排序條件(orderby column)中的資料列建立索引

唯一性索引: 如果確定某個資料列只包含彼此各不相同的值,在為這個資料列建立索引的時候,就應該用關鍵字unique把它定義為乙個唯一索引,mysql會在有新紀錄插入資料表時,自動檢查新紀錄的這個欄位的值是否已經在某個記錄的這個欄位裡出現過了

兩者區別以以下場景為例

假如有乙個表: 主鍵列為 id ,表中有字段 k,並且在 k 上有索引。

建表語句

mysql> create table t(

id int primary key,

k int not null,

name varchar(16),

index (k))engine=innodb;

表中 r1~r5 的 (id,k) 值分別為 (100,1)、(200,2)、(300,3)、(500,5) 和 (600,6),兩棵樹

的示例示意圖如下。

執行查詢語句select id from t where k = 5

兩者效能差異:微乎其微

原因:innodb 的資料是按資料頁為單位來讀寫的。也就是說,當需要讀一條記錄的

時候,並不是將這個記錄本身從磁碟讀出來,而是以頁為單位,將其整體讀入記憶體。在innodb 中,每個資料頁的大小預設是 16kb

因為引擎是按頁讀寫的,所以說,當找到k=5的記錄的時候,它所在的資料頁就都在記憶體裡了。那麼,對於普通索引來說,要多做的那一次「查詢和判斷下一條記錄」操作,就只需要一次指標尋找和一次計算。

概念:change buffer

當需要更新乙個資料頁時,如果資料頁在記憶體中就直接更新,而如果這個資料頁還沒有在

記憶體中的話,在不影響資料一致性的前提下,inoodb 會將這些更新操作快取在 change

buffer 中,這樣就不需要從磁碟中讀入這個資料頁了。在下次查詢需要訪問這個資料頁的時候,將資料頁讀入記憶體,然後執行 change buffer 中與這個頁有關的操作。通過這種方式就能保證這個資料邏輯的正確性。

同時,change buffer也會進行持久化

如果在這張表中插入乙個新記錄(4,400), 對於兩個索引在更新的區別:

需要更新的記錄的目標頁存在記憶體中

需要更新的記錄的目標也不在記憶體中:

將資料從磁碟讀入記憶體涉及隨機io的訪問,是資料庫裡面成本最高的操作之一。change buffer 因為減少了隨機磁碟訪問,所以對更新效能的提公升是會很明顯的。

由於change buffer針對普通索引的更新過程起到了加速作用,但是,普通索引的所有場景,change buffer都會加速嗎?答案是否定的。

因為change buffer將更新的記錄進行快取,而在真正進行更新操作時是在下一次讀取這個表的時候,所以,change buffer中的記錄值越多,收益越大。

可以想到,對於讀少寫多的業務來說,記錄在寫完之後馬上訪問的次數很少,這樣的場景適合change buffer的加速,場景的業務就是:賬單類、日誌類的系統。

相反的是,如果乙個業務的更新模式是寫入之後馬上就進行查詢,更新記錄雖然儲存在了change buffer上,但是馬上查詢這個資料頁就會執行合併操作,這樣的操作不僅訪問io的次數沒有減少,還增加了change buffer的維護成本。 所以,這種場景下 change buffer起了***

兩種索引在查詢上基本上沒有差異,差異在於更新,所以盡量選擇普通索引

如果所有的更新後面,都跟隨著馬上查詢,那麼應該關閉change buffer。

MySQL普通索引與唯一索引

總結參考文獻 當我們需要在乙個唯一欄位上建立索引時,究竟是建立普通索引還是唯一索引的效能更好呢?這時需要從兩個角度考慮 對於普通索引來說,查詢到滿足條件的第乙個記錄後,需要查詢下乙個記錄,直到碰到第乙個不滿足條件的記錄。對於唯一索引來說,由於索引定義了唯一性,查詢到第乙個滿足條件的記錄後,就會停止繼...

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

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

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

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