MySQL普通索引与唯一索引__mysql中唯一索引和普通索引的用途及区别
MySQL普通索引與唯一索引
索引作用:
提高查詢效率,一般加在經常查詢或者排序的字段上。
普通索引:
允許字段值重復
唯一索引:
保證數據記錄唯一性
如何選擇:
查詢過程:
- 對普通索引來說,找到滿足條件的第一個記錄之后,需要繼續查找下一條記錄,直到下一條記錄不滿足條件為止。
- 對唯一索引來說,查找到第一條滿足條件的數據之后,就會停止檢索(唯一性)
查詢效率:
相差不大
-
-
- InnoDB的數據是以頁(16KB大小)為單位進行讀寫
- 一個數據頁可以存放數千個Key
- 普通索引通常情況下多了一次指針尋找和判斷,較低概率跨數據頁查找
-
更新過程:
change buffer:
-
更新一組數據時,若數據頁在內存中就直接更新;
-
若不在內存中,更新操作緩存進change buffer中,待下一次查詢訪問此數據頁時,讀入內存,執行操作;
-
可持久化,在內存中有拷貝,會被寫入磁盤;
-
merge(將change buffer中的數據寫入原數據頁)的時機:
- 訪問這個數據頁
- 系統后臺線程定期merge
- 數據庫正常關閉(shut down)
-
可以減少讀磁盤,提高執行效率。
若更新的目標頁在內存中:
唯一索引:
找到插入的位置,判斷有無沖突,執行更新操作
普通索引:
直接進行更新操作
若數據頁不在內存中:
- 唯一索引:將數據頁讀入內存,判斷有無沖突,插入這個值,
- 普通索引:將更新記錄在change buffer中,適合寫多讀少的情景,如果寫完立刻又進行讀操作,觸發merge,增加了changebuffer的維護成本。
結論:
- 二者在查詢效率上差別不大
- 更新效率上有差別,普通索引可以和change buffer兩兩配合
- 業務正確性優先,如果業務無法保證不會插入重復數據,并且要求數據庫做約束,必須創建唯一索引
mysql中唯一索引和普通索引的用途及區別
唯一索引和普通索引使用的結構都是B-tree,執行時間復雜度都是O(log n)。
1、普通索引
普通索引(由關鍵字KEY或INDEX定義的索引)的唯一任務是加快對數據的訪問速度。因此,應該只為那些最經常出現在查詢條件(WHEREcolumn=)或排序條件(ORDERBYcolumn)中的數據列創建索引。只要有可能,就應該選擇一個數據最整齊、最緊湊的數據列(如一個整數類型的數據列)來創建索引。索引名稱習慣用idx_…命名。
2、唯一索引
普通索引允許被索引的數據列包含重復的值。比如說,因為人有可能同名,所以同一個姓名在同一個“員工個人資料”數據表里可能出現兩次或更多次。 如果能確定某個數據列將只包含彼此各不相同的值,在為這個數據列創建索引的時候就應該用關鍵字UNIQUE把它定義為一個唯一索引。這么做的好處:一是簡化了MySQL對這個索引的管理工作,這個索引也因此而變得更有效率;二是MySQL會在有新記錄插入數據表時,自動檢查新記錄的這個字段的值是否已經在某個記錄的這個字段里出現過了;如果是,MySQL將拒絕插入那條新記錄。也就是說,唯一索引可以保證數據記錄的唯一性。事實上,在許多場合,人們創建唯一索引的目的往往不是為了提高訪問速度,而只是為了避免數據出現重復。索引名稱習慣用uk_…命名。
總結
以上是生活随笔為你收集整理的MySQL普通索引与唯一索引__mysql中唯一索引和普通索引的用途及区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++17(21)-volatile和c
- 下一篇: c++17(22)-reinterpre