无码人妻A片一区二区三区_18禁裸乳无遮挡啪啪无码免费_91精品亚?影视在线?看_人人妻人人爽人人澡AV_国产精品人妻一区二区三区四区_午夜免费影视

中培偉業IT資訊頻道
您現在的位置:首頁 > IT資訊 > 數據庫 > MySQL普通索引和唯一索引有哪些區別?

MySQL普通索引和唯一索引有哪些區別?

2020-07-08 13:38:46 | 來源:中培企業IT培訓網

數據庫是一種以某種方式存儲在一起的數據集合,可以與多個用戶共享,具有最小的可能冗余,并且獨立于應用程序。可以將其視為電子文件柜-存儲電子文件的地方,用戶可以在文件中添加,查詢,更新和刪除數據。數據庫的種類有很多,其中MySQL數據庫中有普通索引和唯一索引兩種,很多人都不知道二者之間的區別。

  MySQL普通索引和唯一索引有哪些區別?

  一、查詢和更新上的區別

這兩類索引在查詢能力上是沒差別的,主要考慮的是對更新性能的影響。建議盡量選擇普通索引。

  1.1MySQL的查詢操作

?普通索引

查找到第一個滿足條件的記錄后,繼續向后遍歷,直到第一個不滿足條件的記錄。

?唯一索引

由于索引定義了唯一性,查找到第一個滿足條件的記錄后,直接停止繼續檢索。

普通索引會多檢索一次,幾乎沒有影響。因為InnoDB的數據是按照數據頁為單位進行讀寫的,需要讀取數據時,并不是直接從磁盤讀取記錄,而是先把數據頁讀到內存,再去數據頁中檢索。

一個數據頁默認16KB,對于整型字段,一個數據頁可以放近千個key,除非要讀取的數據在數據頁的最后一條記錄,就需要再讀一個數據頁,這種情況很少,對CPU的消耗基本可以忽略了。

因此說,在查詢數據方面,普通索引和唯一索引沒差別。

  1.2MySQL的更新操作

更新操作并不是直接對磁盤中的數據進行更新,是先把數據頁從磁盤讀入內存,再更新數據頁。

?普通索引

將數據頁從磁盤讀入內存,更新數據頁。

?唯一索引

將數據頁從磁盤讀入內存,判斷是否唯一,再更新數據頁。

由于MySQL中有個changebuffer的機制,會導致普通索引和唯一索引在更新上有一定的區別。

changebuffer的作用是為了降低IO操作,避免系統負載過高。changebuffer將數據寫入數據頁的過程,叫做merge。

如果需要更新的數據頁在內存中時,會直接更新數據頁;如果數據不在內存中,會先將更新操作記入changebuffer,當下一次讀取數據頁時,順帶merge到數據頁中,changebuffer也有定期merge策略。數據庫正常關閉的過程中,也會觸發merge。

對于唯一索引,更新前需要判斷數據是否唯一(不能和表中數據重復),如果數據頁在內存中,就可以直接判斷并且更新,如果不在內存中,就需要去磁盤中讀出來,判斷一下是否唯一,是的話就更新。changebuffer是用不到的。即使數據頁不在內存中,還是要讀出來。

changebuffer用的是bufferpool里的內存,因此不能無限增大。changebuffer的大小,可以通過參數innodb_change_buffer_max_size來動態設置。這個參數設置為50的時候,表示changebuffer的大小最多只能占用bufferpool的50%。

結論:唯一索引用不了changebuffer,只有普通索引可以用。

  二、changebuffer和redolog的區別

2.1changebuffer的適用場景

changebuffer的作用是降低更新操作的頻率,緩存更新操作。這樣會有一個缺點,就是更新不及時,對于讀操作比較頻繁的表,不建議使用changebuffer。

因為更新操作剛記錄進changebuffer中,就讀取了該表,數據頁被讀到了內存中,數據馬上就merge到數據頁中了。這樣不僅不會降低性能消耗,反而會增加維護changebuffer的成本。

2.2changebuffer和redolog區別

我們舉一個例子用來理解redolog和changebuffer。我們執行以下SQL語句:

mysql>insertintot(id,k)values(id1,k1),(id2,k2);

假設,(id1,k1)在數據頁Page1中,(id2,k2)在數據頁Page2中。并且Page1在內存中,Page2不在內存中。

執行過程如下:

?直接向Page1中寫入(id1,k1);

?在changebuffer中記下"向Page2中寫入(id2,k2)"這條信息;

?將以上兩個動作記入redolog。

做完上面這些,事務就可以完成了。執行這條更新語句的成本很低,就是寫了兩處內存,然后寫了一處磁盤(兩次操作合在一起寫了一次磁盤),而且還是順序寫的。

這條更新語句,涉及了四個部分:內存、redolog(ib_log_fileX)、數據表空間(t.ibd)、系統表空間(ibdata1)。

如果要讀數據的話,過程是怎樣的?

mysql>select*fromtwherekin(k1,k2);

假設讀操作在更新后不久,此時內存中還有Page1,沒有Page2,那么讀操作就和redolog以及ibdata1無關了。

?從內存中獲取到Page1上的最新數據(id1,k1);

?將數據頁Page2讀入內存,執行merge操作,此時內存中的Page2也有最新數據(id2,k2);

  需要注意的是:

?redolog中的數據,可能還沒有flush到磁盤,磁盤中的Page1和Page2中并沒有最新數據,但我們依然可以拿到最新數據(內存中的Page1就是最新的,Page2雖然不是最新的,但是從磁盤讀到內存中后,執行了merge操作,內存中的Page2就是最新的了。)

?如果此時MySQL異常宕機了,比如服務器異常掉電,changebuffer中的數據會不會丟?

changebuffer中的數據分為兩部分,一部分是已經merge到ibdata1中的數據,這部分數據已經持久化,不會丟失。另一部分數據,還在changebuffer中,沒有merge到ibdata1,分3種情況:

?changebuffer寫入數據到內存,redolog也已經寫入(ib-log-filex),但是未commit,binlog中也沒有fsync到磁盤,這部分數據會丟失;

?changebuffer寫入數據到內存,redolog也已經寫入(ib-log-filex),但是未commit,binlog已寫入到磁盤,這部分不會多丟失,異常重啟后會先從binlog恢復redolog,再從redolog恢復changebuffer;

?changebuffer寫入數據到內存,redolog和binlog都已經fsync,直接從redolog恢復,不會丟失。

redolog主要節省的是隨機寫磁盤的IO消耗(轉成順序寫),而changebuffer主要節省的則是隨機讀磁盤的IO消耗。

以上就是關于MySQL普通索引和唯一索引有哪些區別的全部內容介紹,想了解更多關于數據庫的信息,請繼續關注中培偉業。

標簽: MySQL 數據庫
主站蜘蛛池模板: 无码字幕av一区二区三区 | 一二三区影院 | 亚洲一线产区二线产区 | 精品日本久久久久久久久久 | 亚洲丝袜第一页 | 久久在线免费观看 | 99久久精品免费看国产 | 日本欧美一区二区三区在线观看 | 色爽爽爽 | 亚洲女优视频 | 亚洲日韩aⅴ在线视频 | 日韩一卡在线 | 特黄特色特刺激免费播放 | 视频一区二区三区在线观看 | 亚洲欧美日韩国产精品专区 | 日韩精品大桥未久在线 | 91视频入囗| 朋友的姐姐2在线观看 | 啊灬啊灬轻点第一次和外国人 | 日韩精品一区二区在线播放 | 成人在色线视频在线观看免费大全 | 国产会所在线观看 | 一本久道久久综合婷婷鲸鱼 | 蜜桃视频在线观看一区 | 一女被多男玩喷潮3p免费视频 | 亚洲最大国产成人综合网站 | 内射囯产旡码丰满少妇 | 国产成人精品一区二区三区四区 | 日韩一区欧美一区 | 亚洲国产欧美一区二区潘金莲 | 国产精品视频一区二区三区综合 | 中文字幕免费精品一区高清 | 国产69精品久久久久久久久久 | 中文字幕日本精品 | 国产精品成人AAAA网站女吊丝 | 影音先锋新男人AV资源站 | 亚洲男人天堂网 | 久久人人爽人人爽人人片av免费 | 亚洲日本va午夜中文字幕久久 | 成人在线观看影院 | 特级a级毛片 |