MySQL唯一索引和普通索引對效能的影響

2021-10-08 05:25:53 字數 1002 閱讀 8355

先說結論:

對查詢:普通索引和唯一索引對查詢效能影響很小

對更新:唯一索引比普通索引更耗時.

查詢流程:唯一索引找到第乙個匹配資料後不繼續往後查詢.

1.普通索引,從索引樹根節點開始按層往下查詢,找到對應的資料頁,然後二分法查詢節點,找到第乙個匹配的資料後,繼續往後查詢,直到不滿足條件.然後返回.

2.唯一索引,從索引樹根節點開始按層往下查詢,找到對應的資料頁,然後二分法查詢節點,找到第乙個匹配的資料後,直接返回.

更新流程:唯一索引對更新需要判斷是否衝突

1.普通索引,找到對應的資料頁,如果在記憶體中,直接更新,如果不在記憶體中,更新到change buffer中

2.唯一索引,找到對應的資料頁,如果在記憶體中,直接更新,如果不在記憶體中,讀取資料頁,更新記憶體.

知識點:change buffer

1.當需要更新乙個資料頁時,如果資料頁在記憶體中就直接更新,否則快取到change buffer中,在下次查詢需要訪問這個資料頁的時候,將資料頁讀入記憶體,然後把change buffer 應用到這個資料頁中.這個過程稱為merge.

2.除了訪問這個資料頁會觸發 merge 外,系統有後台執行緒會定期 merge。在資料庫正常關閉(shutdown)的過程中,也會執行 merge 操作。

顯然,如果能夠將更新操作先記錄在 change buffer,減少讀磁碟,語句的執行速度會得到明顯的提公升。而且,資料讀入記憶體是需要占用 buffer pool 的,所以這種方式還能夠避免占用記憶體,提高記憶體利用率。

3.change buffer 用的是 buffer pool 裡的記憶體,因此不能無限增大。change buffer 的大小,可以通過引數 innodb_change_buffer_max_size 來動態設定。這個引數設定為 50 的時候,表示 change buffer 的大小最多只能占用 buffer pool 的 50%。

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

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

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

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

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

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