日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Multi-Range Read (MRR)原理

發(fā)布時(shí)間:2024/2/28 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Multi-Range Read (MRR)原理 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

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