包頭市建設(shè)工程安全監(jiān)督站網(wǎng)站萬(wàn)能搜索引擎入口
學(xué)習(xí)mysql普通索引與唯一索引選擇記錄總結(jié),學(xué)習(xí)鏈接:http://gk.link/a/11YG8
從mysql查詢操作分析:
普通索引:查到滿足條件的第一條記錄后,還會(huì)繼續(xù)查找下一條記錄,直到出現(xiàn)滿足條件的記錄出現(xiàn)后停止檢索
唯一索引:由于索引定義了唯一性,查找到第一個(gè)滿足條件的記錄后,就會(huì)停止繼續(xù)檢索
InnoDB 的數(shù)據(jù)是按數(shù)據(jù)頁(yè)為單位來(lái)讀寫的。也就是說(shuō),當(dāng)需要讀一條記錄的時(shí)候,并不是將這個(gè)記錄本身從磁盤讀出來(lái),而是以頁(yè)為單位,將其整體讀入內(nèi)存。對(duì)于查詢來(lái)說(shuō)使用這兩種索引差別微乎其微。
數(shù)據(jù)頁(yè)大小:默認(rèn)16kb
從mysql更新操作分析:
普通索引更新的時(shí)候會(huì)使用到change buffer,對(duì)于唯一索引來(lái)說(shuō),所有的更新操作都要先判斷這個(gè)操作是否違反唯一性約束。唯一索引更新不能使用change buffer。
change buffer是什么?
當(dāng)需要更新一個(gè)數(shù)據(jù)頁(yè),如果數(shù)據(jù)頁(yè)在內(nèi)存中就直接更新,如果不在內(nèi)存中,在不影響數(shù)據(jù)一致性的前提下,InnoDB會(huì)將這些更新操作緩存在change buffer中。下次查詢需要訪問(wèn)這個(gè)數(shù)據(jù)頁(yè)的時(shí)候,將數(shù)據(jù)頁(yè)讀入內(nèi)存,然后執(zhí)行change buffer中的與這個(gè)頁(yè)有關(guān)的操作。保證這個(gè)數(shù)據(jù)邏輯的正確性。
change buffer是可以持久化的數(shù)據(jù)。change buffer主要節(jié)省的是隨機(jī)讀磁盤的IO消耗。
知識(shí)點(diǎn)補(bǔ)充:
merge:將change buffer中的操作應(yīng)用到原數(shù)據(jù)頁(yè)上,得到最新結(jié)果的過(guò)程。
訪問(wèn)數(shù)據(jù)頁(yè)會(huì)觸發(fā)purge,系統(tǒng)有后臺(tái)線程定期merge,在數(shù)據(jù)庫(kù)正常關(guān)閉的過(guò)程中,也會(huì)執(zhí)行merge。merge 的時(shí)候是真正進(jìn)行數(shù)據(jù)更新,change buffer 的主要目的就是將記錄的變更動(dòng)作緩存下來(lái),所以在一個(gè)數(shù)據(jù)頁(yè)做 merge 之前,change buffer 記錄的變更越多(也就是這個(gè)頁(yè)面上要更新的次數(shù)越多),收益就越大
怎樣設(shè)置change buffer
change buffer用的是buffer pool里的內(nèi)存,大小通過(guò)參數(shù)innodb_change_buffer_max_size來(lái)動(dòng)態(tài)設(shè)置。
change buffer使用場(chǎng)景
寫多讀少的業(yè)務(wù)場(chǎng)景,常見(jiàn)的業(yè)務(wù)模型比如:賬單、日志類的系統(tǒng)
反例:比如一個(gè)業(yè)務(wù)場(chǎng)景,更新數(shù)據(jù)后立馬做查詢操作,數(shù)據(jù)庫(kù)會(huì)先將更新先記錄在 change buffer,但是馬上就會(huì)訪問(wèn)這個(gè)數(shù)據(jù)頁(yè),從而觸發(fā) merge 過(guò)程。這樣操作change buffer反而起了副作用,隨機(jī)訪問(wèn)IO的次數(shù)不會(huì)減少,增加了change buffer的維護(hù)代價(jià)。
索引選擇
分析完查詢與更新,得出結(jié)論:盡量選擇普通索引。