Multi-Range Read (MRR)原理
Multi-Range Read (MRR)
MRR?的全稱是?Multi-Range Read Optimization,是優(yōu)化器將隨機(jī)?IO?轉(zhuǎn)化為順序?IO?以降低查詢過程中?IO?開銷的一種手段,這對IO-bound類型的SQL語句性能帶來極大的提升,適用于range ref eq_ref類型的查詢
MRR優(yōu)化的幾個(gè)好處
使數(shù)據(jù)訪問有隨機(jī)變?yōu)轫樞?#xff0c;查詢輔助索引是,首先把查詢結(jié)果按照主鍵進(jìn)行排序,按照主鍵的順序進(jìn)行書簽查找
減少緩沖池中頁被替換的次數(shù)
批量處理對鍵值的操作
在沒有使用MRR特性時(shí)
第一步 先根據(jù)where條件中的輔助索引獲取輔助索引與主鍵的集合,結(jié)果集為rest
| 1 | select?key_column, pk_column from tb where key_column=x order by key_column |
第二步 通過第一步獲取的主鍵來獲取對應(yīng)的值
| 1 2 | for?each pk_column valuein?restdo: select?non_key_column from tb where pk_column=val |
使用MRR特性時(shí)
第一步 先根據(jù)where條件中的輔助索引獲取輔助索引與主鍵的集合,結(jié)果集為rest
| 1 | select?key_column, pk_column from tb where key_column = x order by key_column |
第二步 將結(jié)果集rest放在buffer里面(read_rnd_buffer_size?大小直到buffer滿了),然后對結(jié)果集rest按照pk_column排序,得到結(jié)果集是rest_sort
第三步 利用已經(jīng)排序過的結(jié)果集,訪問表中的數(shù)據(jù),此時(shí)是順序IO.
| 1 | select?non_key_column fromtb where pk_columnin?(rest_sort) |
在不使用?MRR?時(shí),優(yōu)化器需要根據(jù)二級索引返回的記錄來進(jìn)行“回表”,這個(gè)過程一般會有較多的隨機(jī)IO,?使用MRR時(shí),SQL語句的執(zhí)行過程是這樣的:
-
優(yōu)化器將二級索引查詢到的記錄放到一塊緩沖區(qū)中
-
如果二級索引掃描到文件的末尾或者緩沖區(qū)已滿,則使用快速排序?qū)彌_區(qū)中的內(nèi)容按照主鍵進(jìn)行排序
-
用戶線程調(diào)用MRR接口取cluster index,然后根據(jù)cluster index?取行數(shù)據(jù)
-
當(dāng)根據(jù)緩沖區(qū)中的?cluster index取完數(shù)據(jù),則繼續(xù)調(diào)用過程?2) 3),直至掃描結(jié)束
通過上述過程,優(yōu)化器將二級索引隨機(jī)的?IO?進(jìn)行排序,轉(zhuǎn)化為主鍵的有序排列,從而實(shí)現(xiàn)了隨機(jī)?IO?到順序?IO?的轉(zhuǎn)化,提升性能
此外MRR還可以將某些范圍查詢,拆分為鍵值對,來進(jìn)行批量的數(shù)據(jù)查詢,如下:
SELECT * FROM t WHERE?key_part1?>= 1000 AND?key_part1?< 2000AND?key_part2?= 10000;
表t上有二級索引(key_part1, key_part2),索引根據(jù)key_part1,key_part2的順序排序。
若不使用MRR:此時(shí)查詢的類型為Range,sql優(yōu)化器會先將key_part1大于1000小于2000的數(shù)據(jù)取出,即使key_part2不等于10000,帶取出之后再進(jìn)行過濾,會導(dǎo)致很多無用的數(shù)據(jù)被取出
若使用MRR:如果索引中key_part2不為10000的元組越多,最終MRR的效果越好。優(yōu)化器會將查詢條件拆分為(1000,1000),(1001,1000),...?(1999,1000)最終會根據(jù)這些條件進(jìn)行過濾
相關(guān)參數(shù)
當(dāng)mrr=on,mrr_cost_based=on,則表示cost base的方式還選擇啟用MRR優(yōu)化,當(dāng)發(fā)現(xiàn)優(yōu)化后的代價(jià)過高時(shí)就會不使用該項(xiàng)優(yōu)化
當(dāng)mrr=on,mrr_cost_based=off,則表示總是開啟MRR優(yōu)化
| 1 | SET? @@optimizer_switch='mrr=on,mrr_cost_based=on'; |
參數(shù)read_rnd_buffer_size?用來控制鍵值緩沖區(qū)的大小。二級索引掃描到文件的末尾或者緩沖區(qū)已滿,則使用快速排序?qū)彌_區(qū)中的內(nèi)容按照主鍵進(jìn)行排序
總結(jié)
以上是生活随笔為你收集整理的Multi-Range Read (MRR)原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql ICP优化的原理
- 下一篇: 判断一个数是否是2的幂