日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

MySQL唯一索引和普通索引選哪個(gè)?

瀏覽:129日期:2023-10-10 15:31:19

想象這樣一個(gè)場(chǎng)景,在設(shè)計(jì)一張用戶表時(shí),每人的身份證號(hào)是唯一的,需要搜索。但由于身份證號(hào)字段較大,不好將其作為主鍵。在業(yè)務(wù)代碼已經(jīng)保證插入身份證唯一的情況下,可以選擇建立唯一索引和普通索引,這時(shí)該如何選擇呢?接下來(lái),將從查詢和更新的執(zhí)行過程進(jìn)行分析。

查詢過程

假設(shè) k 是表 t 上的索引,在搜索 select id from t where k=5 時(shí),會(huì)先從 k 這棵 B+ 的樹根開始,按層搜索葉子節(jié)點(diǎn),找到 k=5 的數(shù)據(jù)頁(yè),然后在數(shù)據(jù)頁(yè)內(nèi)容進(jìn)行二分法定位。

對(duì)于普通索引,找到 k=5 的記錄后,會(huì)繼續(xù)向下查找一個(gè),直到碰到第一個(gè)不是 5 的記錄結(jié)束。

對(duì)于唯一索引,由于取值唯一,找到后直接停止。

由于 InnoDB 是按照數(shù)據(jù)頁(yè)為單位(數(shù)據(jù)頁(yè)默認(rèn) 16 KB)進(jìn)行讀寫的,在讀取一條數(shù)據(jù)時(shí),會(huì)將整個(gè)數(shù)據(jù)頁(yè)整體讀到內(nèi)存。 在讀入內(nèi)存的數(shù)據(jù)頁(yè)中,如果包含 k=5 的記錄,在查詢的情況下,唯一索引比普通索引多了一次查找和判斷的過程,可以忽略。

如果 k=5 是當(dāng)前數(shù)據(jù)頁(yè)的最后一條,就需要在讀取下一個(gè)數(shù)據(jù)頁(yè)。但這發(fā)生的概率較低,也可以忽略。

所以總得來(lái)說(shuō),普通索引和唯一索引在查詢的過程中差異不大。

change buffer

在分析唯一索引和普通索引的影響前,先來(lái)認(rèn)識(shí)一下 change buffer 這個(gè)結(jié)構(gòu)。

什么是 change buffer ?

在執(zhí)行更新操作時(shí),如果要更新的數(shù)據(jù)頁(yè)在內(nèi)存中就直接更新,否則的話,在不影響數(shù)據(jù)一致性的前提下,InnoDB 會(huì)將更新操作緩存在 change buffer 中,從而省去了從磁盤讀取數(shù)據(jù)頁(yè)的過程。在下次查詢操作讀取到恰好需要更新的數(shù)據(jù)頁(yè)時(shí),會(huì)將 change buffer 的更新語(yǔ)句執(zhí)行,寫入數(shù)據(jù)頁(yè)。將操作應(yīng)用到硬盤的過程叫 merge. 后臺(tái)線程會(huì)定期 merge 或 數(shù)據(jù)庫(kù)正常關(guān)閉時(shí),也會(huì)進(jìn)行 merge 操作。

merge 的執(zhí)行流程:

從磁盤讀入老版本數(shù)據(jù)頁(yè)。 從 change buffer中找出和該數(shù)據(jù)頁(yè)關(guān)聯(lián)的記錄,依次應(yīng)用,得到新版數(shù)據(jù)頁(yè)。 寫 redo log,記錄數(shù)據(jù)的變更和 change buffer 的變更。

change buffer 實(shí)際上是可以持久化到硬盤中的數(shù)據(jù),也就是說(shuō)在內(nèi)存和硬盤上都 change buffer 的存在。change buffer 之前叫 insert buffer,開始只對(duì) insert buffer 有優(yōu)化,后來(lái)加上了對(duì) delete 和 update 的支持,進(jìn)而改名叫 change buffer。

可以看到,先將更新操作記錄在 change buffer,減少了將磁盤數(shù)據(jù)頁(yè)讀取到內(nèi)存的過程,語(yǔ)句的執(zhí)行速度會(huì)有很明顯的提升。同時(shí),將數(shù)據(jù)讀入內(nèi)存,會(huì)占用 buffer pool 內(nèi)存,所以減少讀操作,還提高了內(nèi)存使用率。

Buffer Pool 是內(nèi)存中的一個(gè)區(qū)域,InnoDB 在訪問表和索引數(shù)據(jù)時(shí)會(huì)在其中進(jìn)行緩存。允許在內(nèi)存中直接更新經(jīng)常使用的數(shù)據(jù),來(lái)加快處理速度。在一些專用的服務(wù)器上,會(huì)將 80% 的物理內(nèi)存分為 buffer pool.

可以通過 innodb_change_buffer_max_size 來(lái)設(shè)置 change buffer 占用 buffer pool 的大小。

change buffer 應(yīng)用場(chǎng)景?

如上面提到,change buffer 預(yù)先保存了更新記錄,減少了讀取數(shù)據(jù)頁(yè)的過程,從而提高性能。也就是說(shuō)如果 change buffer 中針對(duì)不同的數(shù)據(jù)頁(yè)如果包含的更新記錄越多,其實(shí)收益也就越大。

因此對(duì)于寫多讀少的業(yè)務(wù)(更新完立即查詢)change buffer 發(fā)揮的作用也就越大。如常見的賬單類,日志類等系統(tǒng)。

如果業(yè)務(wù)是更新完立即查詢,雖然可以將更新記錄放在 change buffer 中,但由于之后要馬上查詢數(shù)據(jù)頁(yè),所以會(huì)立即觸發(fā) merge 過程。這樣隨機(jī)訪問 IO 次數(shù)并不會(huì)減少,反而增加了 change buffer 的維護(hù)代價(jià),起到反效果。

更新過程

對(duì)于唯一索引來(lái)說(shuō),所有的更新操作都需要判斷是否違反唯一性約束。所以必須把所需要的數(shù)據(jù)頁(yè)讀入內(nèi)存,然后直接更新就可以,不需要使用 change buffer. 所以 change buffer 只對(duì)普通索引有用。

具體分析下,對(duì)于一張表插入一個(gè)新記錄:

如果新記錄要更新的數(shù)據(jù)頁(yè)在內(nèi)存中:

對(duì)于唯一索引,找到合適的位置,判斷有沒有沖突,插入值,語(yǔ)句結(jié)束。

對(duì)于普通索引:找到位置,插入值,語(yǔ)句結(jié)束。

所以數(shù)據(jù)頁(yè)在內(nèi)存時(shí),唯一和普通索引就差一個(gè)判斷的過程。可以忽略。

如果新記錄要更新的數(shù)據(jù)頁(yè)不在內(nèi)存中:

對(duì)于唯一索引,將數(shù)據(jù)頁(yè)讀入內(nèi)存,判斷沖突,插入,語(yǔ)句結(jié)束。

對(duì)于普通索引,將語(yǔ)句記錄在 change buffer 中,語(yǔ)句結(jié)束。

由于從磁盤到內(nèi)存涉及隨機(jī) IO 訪問,是數(shù)據(jù)庫(kù)成本最高的操作之一。普通索引比唯一索引減少的讀入操作,可以有很好的性能提升。

唯一或普通索引的選擇

通過在查詢和更新方面,兩者的比較。我們知道,在查詢過程中,除了極特殊情況,其實(shí)兩者的差異并不大。

主要的差異是在更新過程中,要更新的數(shù)據(jù)頁(yè)并不在內(nèi)容中的情況。這時(shí)唯一索引,由于需要唯一性檢查,不能利用 change buffer. 多了從磁盤到內(nèi)容讀取數(shù)據(jù)的過程,其中涉及隨機(jī) IO 的訪問,相對(duì)來(lái)說(shuō)效率就低了。

所以如果業(yè)務(wù)需要更新不錯(cuò)的性能,這時(shí)可以選用普通索引。當(dāng)然一切都是建立在能保證數(shù)據(jù)準(zhǔn)確性的前提下。

當(dāng)如果更新后來(lái)緊接著查詢操作,可以考慮關(guān)掉 change buffer. 其他的情況,change buffer 都能有很好的提升。

特別針對(duì)機(jī)械硬盤,change buffer 效果很顯著。

redo log 和 change buffer 的比較

InnoDB 中 redo log 的出現(xiàn)使其具有了 crash-safe 的能力,同時(shí)還提高了效率,通過 WAL 先寫日志,再寫磁盤。

而 change buffer 是節(jié)省了從磁盤讀入數(shù)據(jù)頁(yè)到內(nèi)存的隨機(jī)IO過程。

下面通過一條插入語(yǔ)句來(lái)分析下兩者間的關(guān)系:

mysql> insert into t(id,k) values(id1,k1),(id2,k2);

假設(shè) k 為普通索引,k1 所插入的數(shù)據(jù)頁(yè)在內(nèi)存中, k2 不在。

MySQL唯一索引和普通索引選哪個(gè)?

執(zhí)行插入操作時(shí),主要涉及了圖中這四部分的內(nèi)容:

InnoDB buffer pool:內(nèi)存區(qū)域

redo log:日志

system table space(ibdata1):系統(tǒng)表空間

data(t.idb): 數(shù)據(jù)表空間

innodb_file_per_table 開啟時(shí),表被創(chuàng)建在獨(dú)立的表空間下,否則的話被創(chuàng)建在系統(tǒng)的表空間下。

執(zhí)行過程如下:

k1 所在的 page1 在內(nèi)存中,直接更新內(nèi)存 k2 所在的 page2 不在內(nèi)存中,記錄在 change buffer. 將 k1 和 k2 的操作記錄在 redo log. 提交事務(wù)。

可以看到這條更新語(yǔ)句(包括插入,刪除,更新操作)執(zhí)行成本很低,兩次寫入內(nèi)存,1次順序?qū)懭氪疟P。虛線的操作,是后臺(tái)操作,不影響響應(yīng)時(shí)間。

再來(lái)看一條查詢語(yǔ)句:

select * from t where k in (k1, k2)

假設(shè)讀語(yǔ)句發(fā)生在更新語(yǔ)句不久,內(nèi)存數(shù)據(jù)還在,此時(shí)讀操作就和系統(tǒng)表空間和 redo log 無(wú)關(guān)。

MySQL唯一索引和普通索引選哪個(gè)?

執(zhí)行過程:

讀取 k1 所在的 page1,在內(nèi)存中,直接返回。注意,并沒有讀磁盤上的數(shù)據(jù),而且磁盤上的數(shù)據(jù)還有可能是之前的版本的。 讀取 k2 所在的 page2,這時(shí)需要將 page2 從磁盤加載到內(nèi)存,并應(yīng)用 change buffer 的內(nèi)容,然后返回正確的結(jié)果。從這里也能看出,change buffer 不適用于更新完立馬去讀的情況。

總結(jié)下 redo log 和 change buffer 的關(guān)系:

存儲(chǔ)位置:change buffer 也會(huì)持久化在硬盤里,但保存在系統(tǒng)表空間 ibdata1 里。而 redo log 是單獨(dú)的文件。

記錄內(nèi)容:change buffer 記錄的是更新操作的內(nèi)容,而 redo log 記錄的是普通數(shù)據(jù)頁(yè)的修改和 change buffer 的改動(dòng)。

同步磁盤過程:同步內(nèi)存中數(shù)據(jù)頁(yè)的修改時(shí)通過 merge 操作進(jìn)行的,而不是根據(jù) redo log.

從更新的過程來(lái)看: redo log 將隨機(jī)寫磁盤的 IO 轉(zhuǎn)換成了順序?qū)懀?change buffer 則是節(jié)省了隨機(jī)讀磁盤的 IO 消耗。

如果服務(wù)器異常掉電,會(huì)不會(huì)導(dǎo)致 change buffer 丟失?

并不會(huì),因?yàn)?change buffer 中的數(shù)據(jù)已經(jīng)被記錄到 redo log 中,所以不會(huì)丟失。

由于 change buffer 一部分?jǐn)?shù)據(jù)在磁盤,一部分在內(nèi)存。對(duì)于在磁盤的數(shù)據(jù)已經(jīng) merge 所以不會(huì)丟失。對(duì)于在內(nèi)存中的數(shù)據(jù):

如果 change buffer 寫入,但 redo log 未提交,binlog 未提交,事務(wù)會(huì)回滾,這部分?jǐn)?shù)據(jù)不存在。 如果 change buffer 寫入,redo log 寫入,binlog 寫入,并已提交,不會(huì)丟失。從 redo log 直接恢復(fù)。 如果 change buffer 寫入,redo log 寫入但未 commit,binlog 寫入,從 binlog 恢復(fù) redo log 再恢復(fù) change buffer.

參考資料

Buffer Pool

以上就是MySQL唯一索引和普通索引選哪個(gè)?的詳細(xì)內(nèi)容,更多關(guān)于MySQL唯一索引和普通索引的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: MySQL 數(shù)據(jù)庫(kù)
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久性天堂网| 久久精品72免费观看| 黄色欧美在线| 精品国产午夜肉伦伦影院| 久久不卡国产精品一区二区| 国产精品分类| 麻豆国产91在线播放| 精品久久电影| 久久精品亚洲人成影院 | 国产精品丝袜在线播放| 国产免费av国片精品草莓男男| 国产精品一区二区精品| 免费在线观看一区| 欧美一区久久| 成人在线视频免费| 香蕉视频亚洲一级| 亚洲精品极品少妇16p| 蜜臀精品一区二区三区在线观看| 日韩av不卡一区二区| 欧美激情日韩| 亚洲天堂免费电影| 国产亚洲一区在线| 日韩午夜视频在线| 成人精品国产亚洲| 国产一区日韩一区| 日本在线一区二区三区| 久久精品亚洲| 国产综合视频| 妖精视频成人观看www| 日韩欧美三区| 国际精品欧美精品| 欧美在线资源| 国产欧美日韩精品一区二区三区| 日韩国产在线| 亚洲综合中文| 麻豆久久一区| 不卡在线一区二区| 日韩激情精品| 91看片一区| 亚洲1区在线观看| 国产66精品| 美日韩精品视频| 国产福利一区二区精品秒拍| 久久97视频| 91久久黄色| 你懂的国产精品| 欧美日韩国产高清电影| 国产精品久久久久久久久久久久久久久 | 午夜精品福利影院| 国产成人精品999在线观看| 一区二区视频欧美| 美女视频黄免费的久久| 激情欧美国产欧美| 日韩综合一区二区| 日韩在线观看| 69堂精品视频在线播放| 国产主播一区| 久久av导航| 一区二区三区午夜视频| 电影91久久久| 亚洲区第一页| 九九精品调教| 国产日产精品_国产精品毛片| 久久中文字幕av| 国产精品第一国产精品| 国产亚洲精品久久久久婷婷瑜伽| 精品伊人久久久| 在线精品视频在线观看高清| 欧美激情视频一区二区三区免费| 亚洲免费网址| 国产精品亚洲一区二区三区在线观看| 日韩激情一区二区| 合欧美一区二区三区| 国产va免费精品观看精品视频| 中文字幕一区二区三区在线视频| 91亚洲国产成人久久精品| 免费人成在线不卡| 欧美日韩在线播放视频| 动漫av一区| 国产伦精品一区二区三区视频| 久久国产精品久久久久久电车| 国产 日韩 欧美一区| 国产日韩欧美中文在线| 日韩影院在线观看| 久久久精品久久久久久96| 国产专区精品| 69堂免费精品视频在线播放| 中文一区在线| 亚洲国内精品| а√天堂中文在线资源8| 欧美日韩一区二区高清| 蜜臀av国产精品久久久久| 免费不卡中文字幕在线| 天堂√中文最新版在线| 欧美激情视频一区二区三区在线播放| 日韩精品一页| 蜜桃av一区二区三区电影| 丝袜美腿诱惑一区二区三区| 麻豆成人在线观看| 日韩亚洲精品在线观看| 久久亚洲影院| 久久成人亚洲| 日韩午夜av在线| 一区二区三区视频免费观看| 日本不良网站在线观看| 福利在线一区| 鲁鲁在线中文| 日本激情一区| 伊人久久国产| 精精国产xxxx视频在线野外| 肉色欧美久久久久久久免费看| 精品视频一区二区三区在线观看| 青草国产精品| 欧美一级二区| 国产精品嫩模av在线| 国产精品嫩模av在线| 欧美在线不卡| 欧美色综合网| 亚洲精品国模| 日本视频一区二区| 国产精品资源| 欧美1区2区3| 成人在线丰满少妇av| 国产精品久久观看| 福利精品一区| 美女福利一区二区三区| 日韩在线短视频| 综合日韩av| 久久久噜噜噜| 亚洲激精日韩激精欧美精品| 国产亚洲精品久久久久婷婷瑜伽| 久久亚洲国产精品一区二区| 免费国产亚洲视频| 日韩激情中文字幕| 久久99精品久久久野外观看| 精品国产麻豆| 日韩电影免费在线观看| 99精品在线观看| 亚洲专区在线| 日本不卡视频在线| 国产精品66| 蜜桃视频在线网站| 欧产日产国产精品视频| 99精品美女| 一区二区三区四区日韩| 国产色99精品9i| 97精品国产| 精品日韩毛片| 日本亚洲欧美天堂免费| 欧美激情一区| 91看片一区| 人人精品人人爱| 国产伦精品一区二区三区千人斩| 色欧美自拍视频| 欧美日韩免费观看一区=区三区| 蜜臀av在线播放一区二区三区| 日韩高清一级| 精品欠久久久中文字幕加勒比| 啪啪国产精品| 亚洲乱码视频| 国产成人精品一区二区三区免费| 在线视频观看日韩| 亚洲欧美一级| 精品亚洲a∨| 美女亚洲一区| 欧美精品国产白浆久久久久| 久久男人av资源站| 免费日韩视频| 国产精品成人国产| 精品中文字幕一区二区三区av| 亚洲开心激情| 国产美女高潮在线| 一区二区三区国产在线| 国产日产精品一区二区三区四区的观看方式| 国产自产自拍视频在线观看| 免播放器亚洲一区| 捆绑调教美女网站视频一区| 亚洲网站视频| 国产欧美日韩亚洲一区二区三区| 日韩一区欧美| 日本aⅴ免费视频一区二区三区| 成人美女视频| 日本一区二区中文字幕| 日韩精品dvd| 欧美视频二区| 狠狠干综合网| 国产成人免费| 中文字幕免费一区二区| 麻豆精品蜜桃视频网站| 不卡中文一二三区| 精品中国亚洲| 亚洲乱码视频| 91精品精品| 国产精品主播在线观看| 亚洲精品网址| 精品国产乱码久久久久久樱花| 在线成人直播| 中文在线免费视频| 国产乱码精品一区二区三区亚洲人| 国产综合亚洲精品一区二|