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