亚洲国产精品人久久,亚洲va国产日韩欧美精品色婷婷,久久久久88色偷偷,免费人成黄页在线观看国际

17站長網

17站長網 首頁 數據庫 Mysql 查看內容

學習MYSQL之ICP、MRR、BKA

2023-3-16 14:38| 查看: 1784 |來源: 互聯網

Index Condition Pushdown(ICP)Index Condition Pushdown (ICP)是mysql使用索引從表中檢索行數據的一種優化方式。ICP原理禁用ICP,存儲引擎會通過遍歷索引定位基 ...

Index Condition Pushdown(ICP)

Index Condition Pushdown (ICP)是mysql使用索引從表中檢索行數據的一種優化方式。

ICP原理

禁用ICP,存儲引擎會通過遍歷索引定位基表中的行,然后返回給MySQL Server層,再去為這些數據行進行WHERE后的條件的過濾。

開啟ICP,如果部分WHERE條件能使用索引中的字段,MySQL Server 會把這部分下推到存儲引擎層,存儲引擎通過索引過濾,把滿足的行從表中讀取出。ICP能減少引擎層訪問基表的次數和MySQL Server 訪問存儲引擎的次數。

ICP的目標是減少從基表中全紀錄讀取操作的數量,從而降低IO操作

對于InnoDB表,ICP只適用于輔助索引。

ICP標識

當使用ICP優化時,執行計劃的Extra列顯示Using indexcondition提示

相關參數

optimizer_switch="index_condition_pushdown=on”;

適用場景

#輔助索引INDEX (zipcode, lastname, firstname).

SELECT * FROM peopleWHERE zipcode='95054'AND lastname LIKE '%etrunia%'AND address LIKE '%Main Street%';

People表有個二級索引INDEX (zipcode, lastname, firstname),用戶只知道某用戶的zipcode,和大概的lastname、address,此時想查詢相關信息。

若不使用ICP:則是通過二級索引中zipcode的值去基表取出所有zipcode='95054'的數據,然后server層再對lastname LIKE '%etrunia%'AND address LIKE '%Main Street%';進行過濾

若使用ICP:則lastname LIKE '%etrunia%'AND address LIKE '%Main Street%'的過濾操作在二級索引中完成,然后再去基表取相關數據

使用限制

l  只支持 select 語句

l  5.6 中只支持 MyISAM與InnoDB引擎

l  5.6中不支持分區表的ICP;從MySQL 5.7.3開始支持分區表的ICP

l  ICP的優化策略可用于range、ref、eq_ref、ref_or_null 類型的訪問數據方法;

l  不支持主建索引的ICP(對于Innodb的聚集索引,完整的記錄已經被讀取到Innodb Buffer,此時使用ICP并不能降低IO操作)

l  當 SQL 使用覆蓋索引時但只檢索部分數據時,ICP 無法使用

l  ICP的加速效果取決于在存儲引擎內通過ICP篩選掉的數據的比例。

Multi-Range Read (MRR)

MRR 的全稱是 Multi-Range Read Optimization,是優化器將隨機 IO 轉化為順序 IO 以降低查詢過程中 IO 開銷的一種手段。

MRR原理

select non_key_column from tb where ey_column=x;

在沒有使用MRR特性時,MySQL執行查詢的偽代碼

第一步 先根據where條件中的輔助索引獲取輔助索引與主鍵的集合,結果集為rest。

select key_column, pk_column from tb where key_column=x order by key_column

第二步 通過第一步獲取的主鍵來獲取對應的值。

for each pk_column value in rest do:

select non_key_column from tb where pk_column=val

使用MRR特性時,MySQL執行查詢的偽代碼

第一步 先根據where條件中的輔助索引獲取輔助索引與主鍵的集合,結果集為rest

select key_column, pk_column from tb where key_column = x order by key_column

第二步 將結果集rest放在buffer里面(read_rnd_buffer_size 大小直到buffer滿了),然后對結果集rest按照pk_column排序,得到結果集是rest_sort

第三步 利用已經排序過的結果集,訪問表中的數據,此時是順序IO.

select non_key_column fromtb where pk_column in (rest_sort)

綜上

在不使用 MRR 時,優化器需要根據二級索引返回的記錄來進行“回表”,這個過程一般會有較多的隨機IO, 使用MRR時,SQL語句的執行過程是這樣的:

1)   優化器將二級索引查詢到的記錄放到一塊緩沖區中

2)   如果二級索引掃描到文件的末尾或者緩沖區已滿,則使用快速排序對緩沖區中的內容按照主鍵進行排序

3)   用戶線程調用MRR接口取cluster index,然后根據cluster index 取行數據

4)   當根據緩沖區中的 cluster index取完數據,則繼續調用過程 2) 3),直至掃描結束

通過上述過程,優化器將二級索引隨機的 IO 進行排序,轉化為主鍵的有序排列,從而實現了隨機 IO 到順序 IO 的轉化,提升性能

此外MRR還可以將某些范圍查詢,拆分為鍵值對,來進行批量的數據查詢,如下:

SELECT * FROM tWHERE key_part1 >= 1000 AND key_part1 < 2000AND key_part2 = 10000;

表t上有二級索引(key_part1, key_part2),索引根據key_part1,key_part2的順序排序。

若不使用MRR:索引掃描會將key_part1在1000到2000的索引元組,而不管key_part2的值,這樣對key_part2不等于10000的索引元組也做了額外的掃描。此時掃描的范圍是:

[{1000, 10000}, {2000, MIN_INT}]此間隔可能包含key_part2不等于10000的部分

若使用MRR:掃描則分為多個范圍,對于每一個Key_part1(1000,1001…,1999)單個值的掃描只需要掃描索引中key_part2為10000的元組。如果索引中包含很多key_part2不為10000的元組,最終MRR的效果越好。MRR掃描的范圍是多個單點間隔[{1000, 10000}], ..., [{1999, 10000}] 此間隔只包含key_part2=10000的部分。

MRR標識

當使用ICP優化時,執行計劃的Extra列顯示Using MRR提示

相關參數

用optimizer_switch 的標記來控制是否使用MRR.設置mrr=on時,表示啟用MRR優化。

mrr_cost_based表示是否通過cost base的方式來啟用MRR.

當mrr=on,mrr_cost_based=on,則表示cost base的方式還選擇啟用MRR優化,當發現優化后的代價過高時就會不使用該項優化

當mrr=on,mrr_cost_based=off,則表示總是開啟MRR優化

SET  @@optimizer_switch='mrr=on,mrr_cost_based=on';

參數read_rnd_buffer_size 用來控制鍵值緩沖區的大小。二級索引掃描到文件的末尾或者緩沖區已滿,則使用快速排序對緩沖區中的內容按照主鍵進行排序

適用場景

#輔助索引key_part1,查詢key_part1在1000到2000范圍內的數據

SELECT * FROM t WHERE key_part1 >= 1000 AND key_part1 < 2000

不使用MRR:先通過二級索引的key_part1字段取出滿足條件的key_part1,pk_col order by key_part1.然后通過pk_col去表中取出滿足條件的數據,此時,因為取出的pk_col是亂序的,而表又是pk_col存放數據的,當去表中取數據時,則會產生大量的隨機IO

使用MRR:先通過二級索引的key_part1字段取出滿足條件的key_part1,pk_col order by key_part1.放到緩存中(read_rnd_buffer_size),當對應的緩沖滿了以后,將這部分key值按照pk_col排序,最后再按照排序后的reset去取表中數據,此時pk_col1是順序的,將隨機IO轉化為順序IO,多頁數據記錄可一次性讀入或根據此次的主鍵范圍分次讀入,以減少IO操作,提高查詢效率

使用限制

MRR 適用于range、ref、eq_ref的查詢

Batched Key Access (BKA)和Block Nested-Loop(BNL)

Batched Key Access (BKA)-- 提高表join性能的算法。

當被join的表能夠使用索引時,就先排好順序,然后再去檢索被join的表,聽起來和MRR類似,實際上MRR也可以想象成二級索引和primary key的join

如果被Join的表上沒有索引,則使用老版本的BNL策略(BLOCK Nested-loop)

BKA原理

對于多表join語句,當MySQL使用索引訪問第二個join表的時候,使用一個join buffer來收集第一個操作對象生成的相關列值。BKA構建好key后,批量傳給引擎層做索引查找。key是通過MRR接口提交給引擎的(mrr目的是較為順序).這樣,MRR使得查詢更有效率。

大致的過程如下:

1 BKA使用join buffer保存由join的第一個操作產生的符合條件的數據

2 然后BKA算法構建key來訪問被連接的表,并批量使用MRR接口提交keys到數據庫存儲引擎去查找查找。

3 提交keys之后,MRR使用最佳的方式來獲取行并反饋給BKA

BNL和BKA都是批量的提交一部分行給被join的表,從而減少訪問的次數,那么它們有什么區別呢?

BKA和BNL標識

Using join buffer (Batched Key Access)和Using join buffer (Block Nested Loop)

相關參數

BAK使用了MRR,要想使用BAK必須打開MRR功能,而MRR基于mrr_cost_based的成本估算并不能保證總是使用MRR,官方推薦設置mrr_cost_based=off來總是開啟MRR功能。打開BAK功能(BAK默認OFF):

SET optimizer_switch='mrr=on,mrr_cost_based=off,batched_key_access=on';

BKA使用join buffer size來確定buffer的大小,buffer越大,訪問被join的表/內部表就越順序。

BNL默認是開啟的,設置BNL相關參數:

SET optimizer_switch=’block_nested_loop’

適用場景

支持inner join, outer join, semi-join operations,including nested outer joins

BKA主要適用于join的表上有索引可利用,無索引只能使用BNL了

ICP優化(Index Condition Pushdown)

Index Condition Pushdown (ICP)是MySQL用索引去表里取數據的一種優化。禁用ICP(MySQL5.6之前),引擎層會利用索引在基表中尋找數據行,然后返回給MySQL Server層,再去為這些數據行進行WHERE后的條件的過濾(回表)。啟用ICP(MySQL5.6之后),如果部分WHERE條件能使用索引中的字段,MySQL會把這部分下推到引擎層。存儲引擎通過使用索引把滿足的行從表中讀取出。ICP減少了引擎層訪問基表的次數和MySQL Server 訪問存儲引擎的次數。總之是 ICP的優化在引擎層就能夠過濾掉大量的數據,減少io次數,提高查詢語句性能

MRR優化(Multi-Range Read)

Multi-Range Read 多范圍讀(MRR) 它的作用是基于輔助/第二索引的查詢,減少隨機IO,并且將隨機IO轉化為順序IO,提高查詢效率。在沒有MRR之前(MySQL5.6之前),先根據where條件中的輔助索引獲取輔助索引與主鍵的集合,再通過主鍵來獲取對應的值。輔助索引獲取的主鍵來訪問表中的數據會導致隨機的IO(輔助索引的存儲順序并非與主鍵的順序一致),不同主鍵不在同一個page里面時必然導致多次IO 和隨機讀。使用MRR優化(MySQL5.6之后),先根據where條件中的輔助索引獲取輔助索引與主鍵的集合,再將結果集放在buffer里面(read_rnd_buffer_size 大小直到buffer滿了),然后對結果集按照pk_column排序,得到有序的結果集rest_sort。最后利用已經排序過的結果集,訪問表中的數據,此時是順序IO。即MySQL 將根據輔助索引獲取的結果集根據主鍵進行排序,將無序化為有序,可以用主鍵順序訪問基表,將隨機讀轉化為順序讀,多頁數據記錄可一次性讀入或根據此次的主鍵范圍分次讀入,以減少IO操作,提高查詢效率。

Nested Loop Join算法:

將驅動表/外部表的結果集作為循環基礎數據,然后循環該結果集,每次獲取一條數據作為下一個表的過濾條件查詢數據,然后合并結果,獲取結果集返回給客戶端。Nested-Loop一次只將一行傳入內層循環, 所以外層循環(的結果集)有多少行, 內存循環便要執行多少次,效率非常差。

Block Nested-Loop Join算法:

將外層循環的行/結果集存入join buffer, 內層循環的每一行與整個buffer中的記錄做比較,從而減少內層循環的次數。主要用于當被join的表上無索引。

Batched Key Access算法:

當被join的表能夠使用索引時,就先排好順序,然后再去檢索被join的表。對這些行按照索引字段進行排序,因此減少了隨機IO。如果被Join的表上沒有索引,則使用老版本的BNL策略(BLOCK Nested-loop)

本文最后更新于 2023-3-16 14:38,某些文章具有時效性,若有錯誤或已失效,請在網站留言或聯系站長:17tui@17tui.com
·END·
站長網微信號:w17tui,關注站長、創業、關注互聯網人 - 互聯網創業者營銷服務中心

免責聲明:本站部分文章和圖片均來自用戶投稿和網絡收集,旨在傳播知識,文章和圖片版權歸原作者及原出處所有,僅供學習與參考,請勿用于商業用途,如果損害了您的權利,請聯系我們及時修正或刪除。謝謝!

17站長網微信二維碼

始終以前瞻性的眼光聚焦站長、創業、互聯網等領域,為您提供最新最全的互聯網資訊,幫助站長轉型升級,為互聯網創業者提供更加優質的創業信息和品牌營銷服務,與站長一起進步!讓互聯網創業者不再孤獨!

掃一掃,關注站長網微信

大家都在看

    熱門排行

      最近更新

        返回頂部
        亚洲国产精品人久久,亚洲va国产日韩欧美精品色婷婷,久久久久88色偷偷,免费人成黄页在线观看国际
        91精品免费观看| 一区二区三区欧美激情| 精品国产99国产精品| 国产欧美va欧美不卡在线| 亚洲视频一区二区在线| 蜜桃视频在线观看一区二区| 不卡在线观看av| 精品第一国产综合精品aⅴ| 一片黄亚洲嫩模| av成人免费在线| 久久久国产精华| 免费精品视频在线| 欧美理论片在线| 一二三区精品福利视频| 99re热这里只有精品免费视频| 精品少妇一区二区三区在线播放| 一区二区三区日韩精品视频| 成人精品国产福利| 中文字幕乱码一区二区免费| 久久精品99国产国产精| 日韩欧美三级在线| 蜜臀av亚洲一区中文字幕| 欧美日韩国产片| 亚洲大片精品永久免费| 欧美在线观看视频一区二区三区| 中文字幕第一区| 成人av在线观| 亚洲另类在线视频| 欧美视频在线观看一区| 亚洲高清视频的网址| 欧美日韩精品系列| 免费三级欧美电影| 精品少妇一区二区三区 | 亚洲精品日韩一| 色av一区二区| 日本亚洲一区二区| 精品国产一区二区亚洲人成毛片| 精品一区二区在线观看| 国产清纯白嫩初高生在线观看91| 成人激情av网| 亚洲国产一区二区在线播放| 欧美日韩国产美| 一区二区免费在线| 制服.丝袜.亚洲.中文.综合| 久久国产精品99久久久久久老狼 | 高清不卡在线观看av| 中文字幕一区在线观看视频| 欧美在线综合视频| 麻豆91在线播放免费| 亚洲国产精华液网站w | 亚洲午夜视频在线观看| 3d动漫精品啪啪一区二区竹菊| 麻豆国产精品视频| 中文字幕综合网| 欧美一区二区三区喷汁尤物| 床上的激情91.| 亚洲v精品v日韩v欧美v专区| 久久日韩粉嫩一区二区三区| 色香蕉成人二区免费| 韩国毛片一区二区三区| 亚洲与欧洲av电影| 久久九九全国免费| 精品视频123区在线观看| 国产ts人妖一区二区| 五月婷婷激情综合| 亚洲视频一二区| 国产视频一区在线观看| 678五月天丁香亚洲综合网| 成人晚上爱看视频| 精品一区二区国语对白| 午夜精品福利一区二区三区蜜桃| 国产精品国产三级国产a| 精品福利视频一区二区三区| 欧美日韩成人一区| 91丝袜高跟美女视频| 国产精品自在欧美一区| 天天射综合影视| 亚洲一二三四在线| 一区二区三区中文在线| 中国色在线观看另类| 久久午夜色播影院免费高清 | 2020国产精品自拍| 日韩欧美一级在线播放| 91.麻豆视频| 欧美精品123区| 在线成人小视频| 欧美男女性生活在线直播观看| 欧美在线视频不卡| 在线视频欧美区| 欧美日本在线一区| 欧美伦理视频网站| 欧美一级xxx| 日韩免费一区二区| 久久久久久久久久久电影| 久久毛片高清国产| 国产欧美精品一区二区三区四区| 欧美不卡一区二区三区四区| 精品噜噜噜噜久久久久久久久试看 | 久久一区二区三区国产精品| 91精品国产综合久久久蜜臀粉嫩| 欧美老肥妇做.爰bbww视频| 欧美日韩免费在线视频| 欧美哺乳videos| 久久无码av三级| 中文字幕一区二区三区在线不卡| 中文字幕一区二区不卡| 亚洲一区二区三区不卡国产欧美| 亚洲成人av一区二区三区| 美女一区二区久久| 成人免费视频播放| 91福利精品视频| 精品日韩一区二区三区| 亚洲欧洲av在线| 亚洲v日本v欧美v久久精品| 精品一区二区三区在线播放| 成人黄色免费短视频| 欧美午夜一区二区三区 | 日韩和的一区二区| 国产精品一区二区你懂的| 91美女蜜桃在线| 日韩一区二区三区av| 国产精品美女久久久久久久网站| 亚洲成a人在线观看| 国产精品一线二线三线| 欧洲精品视频在线观看| 久久品道一品道久久精品| 亚洲狠狠爱一区二区三区| 国产高清在线精品| 在线播放日韩导航| 亚洲图片激情小说| 国产一级精品在线| 91精品国产乱码| 亚洲综合自拍偷拍| 国产成人精品亚洲日本在线桃色| 欧美性大战xxxxx久久久| 国产日韩欧美麻豆| 久久国产尿小便嘘嘘| 在线欧美日韩精品| 亚洲天堂免费看| 国产ts人妖一区二区| 欧美成人艳星乳罩| 丝袜脚交一区二区| 欧美视频一区二区| 亚洲人123区| a亚洲天堂av| 中文字幕av不卡| 高清国产一区二区| 中文字幕欧美国产| 高潮精品一区videoshd| 欧美sm美女调教| 国产原创一区二区| www国产精品av| 国产在线国偷精品产拍免费yy| 日韩精品一区二区三区蜜臀| 日日夜夜免费精品| 91精品国产福利在线观看| 婷婷成人综合网| 欧美一区二区成人6969| 老司机精品视频导航| 精品免费国产二区三区 | 色av成人天堂桃色av| 亚洲第一福利一区| 在线播放91灌醉迷j高跟美女 | 一区二区三区美女视频| 日韩视频免费观看高清完整版 | 久久99日本精品| 日韩欧美黄色影院| 国产一区视频在线看| 日本一区二区三级电影在线观看| 国产不卡视频在线播放| 欧美国产日本视频| 色婷婷综合视频在线观看| 亚洲图片有声小说| 欧美大片拔萝卜| 处破女av一区二区| 亚洲精品一二三四区| 3d成人动漫网站| 国产99久久久国产精品潘金网站| 中文字幕一区二区三区精华液| 日本电影欧美片| 久久成人免费网| 综合色天天鬼久久鬼色| 欧美日韩一区不卡| 国产精品亚洲第一区在线暖暖韩国| 国产精品白丝在线| 91精品国产乱码| 99久久精品国产观看| 免费看黄色91| 亚洲三级理论片| 精品成人a区在线观看| 色屁屁一区二区| 国产在线精品一区二区夜色| 亚洲视频一二区| 久久综合九色综合97婷婷女人| 91蜜桃网址入口| 国产高清一区日本| 免费观看成人鲁鲁鲁鲁鲁视频| 亚洲视频在线一区二区| 久久久久久久久99精品| 欧美一区在线视频|