日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

MySQL普通索引与唯一索引__mysql中唯一索引和普通索引的用途及区别

發(fā)布時(shí)間:2025/3/12 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL普通索引与唯一索引__mysql中唯一索引和普通索引的用途及区别 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。