真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

MySQL中MRR的作用是什么

MySQL 中MRR的作用是什么,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

創(chuàng)新互聯(lián)2013年至今,先為臨澤等服務建站,臨澤等地企業(yè),進行企業(yè)商務咨詢服務。為臨澤企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務解決您的所有建站問題。

執(zhí)行一個范圍查詢:

mysql > explain select * from stu where age between 10 and 20; +----+-------------+-------+-------+------+---------+------+------+-----------------------+ | id | select_type | table | type  | key  | key_len | ref  | rows | Extra                 | +----+-------------+-------+-------+----------------+------+------+-----------------------+ |  1 | SIMPLE      |  stu  | range | age  | 5       | NULL |  960 | Using index condition | +----+-------------+-------+-------+----------------+------+------+-------------

當這個 sql 被執(zhí)行時,MySQL 會按照下圖的方式,去磁盤讀取數(shù)據(jù)(假設數(shù)據(jù)不在數(shù)據(jù)緩沖池里):

MySQL 中MRR的作用是什么

圖中紅色線就是整個的查詢過程,藍色線則是磁盤的運動路線。

這張圖是按照 Myisam 的索引結(jié)構(gòu)畫的,不過對于 Innodb 也同樣適用。

對于 Myisam,左邊就是字段 age 的二級索引,右邊是存儲完整行數(shù)據(jù)的地方。

先到左邊的二級索引找,找到第一條符合條件的記錄(實際上每個節(jié)點是一個頁,一個頁可以有很多條記錄,這里我們假設每個頁只有一條),接著到右邊去讀取這條數(shù)據(jù)的完整記錄。

讀取完后,回到左邊,繼續(xù)找下一條符合條件的記錄,找到后,再到右邊讀取,這時發(fā)現(xiàn)這條數(shù)據(jù)跟上一條數(shù)據(jù),在物理存儲位置上,離的賊遠!

咋辦,沒辦法,只能讓磁盤和磁頭一起做機械運動,去給你讀取這條數(shù)據(jù)。

第三條、第四條,都是一樣,每次讀取數(shù)據(jù),磁盤和磁頭都得跑好遠一段路。

磁盤的簡化結(jié)構(gòu)可以看成這樣:

MySQL 中MRR的作用是什么

MySQL 中MRR的作用是什么

可以想象一下,為了執(zhí)行你這條 sql 語句,磁盤要不停的旋轉(zhuǎn),磁頭要不停的移動,這些機械運動,都是很費時的。

10,000 RPM(Revolutions Per Minute,即轉(zhuǎn)每分) 的機械硬盤,每秒大概可以執(zhí)行 167  次磁盤讀取,所以在極端情況下,MySQL 每秒只能給你返回 167 條數(shù)據(jù),這還不算上 CPU 排隊時間。

上面講的都是機械硬盤,SSD 的土豪,請隨意 - -

對于 Innodb,也是一樣的。 Innodb 是聚簇索引(cluster index),所以只需要把右邊也換成一顆葉子節(jié)點帶有完整數(shù)據(jù)的 B+ tree  就可以了。

順序讀:一場狂風暴雨般的革命

到這里你知道了磁盤隨機訪問是多么奢侈的事了,所以,很明顯,要把隨機訪問轉(zhuǎn)化成順序訪問:

mysql > set optimizer_switch='mrr=on'; Query OK, 0 rows affected (0.06 sec)  mysql > explain select * from stu where age between 10 and 20; +----+-------------+-------+-------+------+---------+------+------+----------------+ | id | select_type | table | type  | key  | key_len | ref  | rows | Extra          | +----+-------------+-------+-------+------+---------+------+------+----------------+ |  1 | SIMPLE      | tbl   | range | age  |    5    | NULL |  960 | ...; Using MRR | +----+-------------+-------+-------+------+---------+------+------+----------------+

我們開啟了 MRR,重新執(zhí)行 sql 語句,發(fā)現(xiàn) Extra 里多了一個「Using MRR」。

這下 MySQL 的查詢過程會變成這樣:

MySQL 中MRR的作用是什么

對于 Myisam,在去磁盤獲取完整數(shù)據(jù)之前,會先按照 rowid 排好序,再去順序的讀取磁盤。

對于 Innodb,則會按照聚簇索引鍵值排好序,再順序的讀取聚簇索引。

順序讀帶來了幾個好處:

1、磁盤和磁頭不再需要來回做機械運動;

2、可以充分利用磁盤預讀

比如在客戶端請求一頁的數(shù)據(jù)時,可以把后面幾頁的數(shù)據(jù)也一起返回,放到數(shù)據(jù)緩沖池中,這樣如果下次剛好需要下一頁的數(shù)據(jù),就不再需要到磁盤讀取。這樣做的理論依據(jù)是計算機科學中著名的局部性原理:

當一個數(shù)據(jù)被用到時,其附近的數(shù)據(jù)也通常會馬上被使用。

3、在一次查詢中,每一頁的數(shù)據(jù)只會從磁盤讀取一次

MySQL 從磁盤讀取頁的數(shù)據(jù)后,會把數(shù)據(jù)放到數(shù)據(jù)緩沖池,下次如果還用到這個頁,就不需要去磁盤讀取,直接從內(nèi)存讀。

但是如果不排序,可能你在讀取了第 1 頁的數(shù)據(jù)后,會去讀取第2、3、4頁數(shù)據(jù),接著你又要去讀取第 1 頁的數(shù)據(jù),這時你發(fā)現(xiàn)第 1  頁的數(shù)據(jù),已經(jīng)從緩存中被剔除了,于是又得再去磁盤讀取第 1 頁的數(shù)據(jù)。

而轉(zhuǎn)化為順序讀后,你會連續(xù)的使用第 1 頁的數(shù)據(jù),這時候按照 MySQL  的緩存剔除機制,這一頁的緩存是不會失效的,直到你利用完這一頁的數(shù)據(jù),由于是順序讀,在這次查詢的余下過程中,你確信不會再用到這一頁的數(shù)據(jù),可以和這一頁數(shù)據(jù)說告辭了。

順序讀就是通過這三個方面,最大的優(yōu)化了索引的讀取。

別忘了,索引本身就是為了減少磁盤 IO,加快查詢,而 MRR,則是把索引減少磁盤 IO 的作用,進一步放大。

一些關于這場革命的配置

和 MRR 相關的配置有兩個:

  • mrr: on/off

  • mrr_cost_based: on/off

第一個就是上面演示時用到的,用來打開 MRR 的開關:

mysql > set optimizer_switch='mrr=on';

如果你不打開,是一定不會用到 MRR 的。

另一個,則是用來告訴優(yōu)化器,要不要基于使用 MRR 的成本,考慮使用 MRR 是否值得(cost-based choice),來決定具體的 sql  語句里要不要使用 MRR。

很明顯,對于只返回一行數(shù)據(jù)的查詢,是沒有必要 MRR 的,而如果你把 mrr_cost_based 設為 off,那優(yōu)化器就會通通使用  MRR,這在有些情況下是很 stupid 的,所以建議這個配置還是設為 on,畢竟優(yōu)化器在絕大多數(shù)情況下都是正確的。

另外還有一個配置 read_rnd_buffer_size ,是用來設置用于給 rowid 排序的內(nèi)存的大小。

顯然,MRR 在本質(zhì)上是一種用空間換時間的算法。MySQL 不可能給你無限的內(nèi)存來進行排序,如果 read_rnd_buffer 滿了,就會先把滿了的  rowid 排好序去磁盤讀取,接著清空,然后再往里面繼續(xù)放 rowid,直到 read_rnd_buffer 又達到 read_rnd_buffe  配置的上限,如此循環(huán)。

看完上述內(nèi)容,你們掌握MySQL 中MRR的作用是什么的方法了嗎?如果還想學到更多技能或想了解更多相關內(nèi)容,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


網(wǎng)頁標題:MySQL中MRR的作用是什么
地址分享:http://weahome.cn/article/pdscgj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部