日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

MySQL 統(tǒng)計信息以及執(zhí)行計劃預(yù)估方式初探

瀏覽:35日期:2023-10-16 13:17:13

數(shù)據(jù)庫中的統(tǒng)計信息在不同(精確)程度上描述了表中數(shù)據(jù)的分布情況,執(zhí)行計劃通過統(tǒng)計信息獲取符合查詢條件的數(shù)據(jù)大小(行數(shù)),來指導(dǎo)執(zhí)行計劃的生成。

在以O(shè)racle和SQLServer為代表的商業(yè)數(shù)據(jù)庫,和以開源的PostgreSQL為代表的數(shù)據(jù)庫中,直方圖是統(tǒng)計信息的一個重要組成部分。

在生成執(zhí)行計劃的時候,通過統(tǒng)計信息以及統(tǒng)計信息的直方圖來預(yù)估符合條件的數(shù)據(jù)行數(shù),從而影響執(zhí)行計劃的生成。

統(tǒng)計信息對執(zhí)行計劃的影響,具體體現(xiàn)在:索引的查找與掃描,多表連接時表之間的驅(qū)動順序,表之間的JOIN方式,以及對sql查詢語句的資源分配等等。

但是在MySQL數(shù)據(jù)庫中,執(zhí)行計劃的方式相對簡單,表之間的JOIN只有LOOPJOIN一種方式,且沒有并行執(zhí)行計劃等,也就說通過預(yù)估結(jié)果集的行數(shù)對執(zhí)行計劃的影響有限。

但是對于某些情況,依舊需要預(yù)估的方式來指導(dǎo)執(zhí)行計劃的生成,

比如常見的多表連接時驅(qū)動順序,多數(shù)情況下是小表驅(qū)動大表(不完全一定)的方式來實現(xiàn)查詢的,因此MySQL中一樣需要預(yù)估來指導(dǎo)執(zhí)行計劃的生成。

不過MySQL中的統(tǒng)計信息相對來說簡單很多,只有一個cardinality信息來預(yù)估索引的選擇性(show index from table),

索引統(tǒng)計信息不包含直方圖的信息,非索引列也不會生成直方圖,也就是無法通過直方圖來預(yù)估查詢數(shù)據(jù)的大小,mysql是通過其他方式來實現(xiàn)預(yù)估的。

對于有直方圖的數(shù)據(jù)來說,直方圖為預(yù)估提供了重要的依據(jù),對于沒有直方圖的MySQL,執(zhí)行計劃是如何預(yù)估的?預(yù)估的準(zhǔn)確性有如何?

筆者在研究這個問題的時候,一開始也遇到不少疑惑的地方,還是看了博客園大神的問題才得以釋惑,后面會給出鏈接。

首先通過例子,通過一個非常簡單的查詢來觀察一個有意思的現(xiàn)象。

新建測試表,測試表如下:

create table test_statistics( id int auto_increment primary key, col2 varchar(200), col3 varchar(200), create_date datetime, index idx_create_date(create_date))ENGINE=InnoDB;

存儲過程通過循環(huán)插入數(shù)據(jù),調(diào)用存儲過程生成100W行數(shù)據(jù)(100W行的數(shù)據(jù),在實際應(yīng)用中已經(jīng)是一個非常小的數(shù)據(jù)量了),create_date字段上生成一個范圍之內(nèi)的隨機時間。

CREATE DEFINER=`root`@`%` PROCEDURE `p_insert_test_data`( IN `loop_count` INT)BEGIN declare i int; while (loop_count>0) do insert into test_statistics(col2,col3,create_date) values (uuid(),uuid(), DATE_ADD(sysdate(), INTERVAL -rand()*2400 hour));set loop_count = loop_count -1; end while;END

寫入測試數(shù)據(jù)完成之后,進行如下兩個查詢做測試。

簡單地使用select count(1)的來做測試

首先看第一個查詢:查詢的時間范圍是: where create_date>’2017-11-01 12:00:00′ and create_date<’2017-11-01 16:00:00′

可以發(fā)現(xiàn):explain預(yù)估的行數(shù),與實際行數(shù)完全一致。

MySQL 統(tǒng)計信息以及執(zhí)行計劃預(yù)估方式初探

繼續(xù)第二個查詢,擴大查詢的時間范圍,查詢的時間范圍是:where create_date>’2017-11-01 12:00:00′ and create_date<’2017-11-03 16:00:00′

可以發(fā)現(xiàn),此時的explain執(zhí)行計劃的預(yù)估,與實際行數(shù)出現(xiàn)了嚴(yán)重的偏差

MySQL 統(tǒng)計信息以及執(zhí)行計劃預(yù)估方式初探

為什么第一個查詢做到了精確的預(yù)估,而第二個查詢的預(yù)估出現(xiàn)嚴(yán)重的偏差?

這一點要從預(yù)估的計算方式入手來說。

首先,第一個查詢和第二個查詢,唯一的不同是,第二個查詢的時間范圍放寬了,為什么時間放寬之后,執(zhí)行計劃的預(yù)估的準(zhǔn)確性就大大下降?

既然是“預(yù)估”,就一定是存在誤差,只不過是誤差大與小的問題,誤差的大下與具體的預(yù)估的方式有關(guān)。

任何預(yù)估的實現(xiàn),都是以一種在不同程度上“以偏概全”的方式進行的,比如SQL Server是以對相關(guān)數(shù)據(jù)page的通過某種百分比來取樣,然后存儲在直方圖中做預(yù)估依據(jù)的。

當(dāng)然,這種“以偏概全”的預(yù)估方式,是在性能與精確度之間權(quán)衡折中的結(jié)果.

在考慮收集統(tǒng)計信息對性能和資源影響的前提下,預(yù)估策略各種方式或者代價盡可能減少對預(yù)估產(chǎn)生誤差的因素,關(guān)于直方圖的生成這里不細(xì)說。

對于沒有直方圖的MySQL,它是是在執(zhí)行的時候,通過掃描符合查詢條件的部分?jǐn)?shù)據(jù)頁后做預(yù)估統(tǒng)計的.

MySQL是在查詢的時候,直接對查詢條件范圍內(nèi)的數(shù)據(jù)頁,取一定比例樣本做統(tǒng)計之后預(yù)估的,但是這里取樣的數(shù)據(jù)頁面有一定的限制,不會無限制取樣做統(tǒng)計預(yù)估。

如果符合條件的數(shù)據(jù)頁超出了預(yù)定的范圍,則會取部分頁進行預(yù)估,而不是全部頁(為什么不是全部樣做統(tǒng)計預(yù)估,原因就不用說了吧)。

比如下圖中,不管是聚集索引還是二級索引(非聚集索引),理論上說都是一顆平衡樹,暫不探究其細(xì)節(jié)。

假如符合條件的數(shù)據(jù)是一個范圍,位于兩個矩形框之間。矩形框分別是范圍的左右節(jié)點,中間可以想象成多個葉子節(jié)點

參考zhanlijun大神的文章 ,

上述參考鏈接中得知,MySQL在5.5之后的預(yù)估原理如下:

其預(yù)估掃描的數(shù)據(jù)頁分別是前后兩個數(shù)據(jù)頁,以及從左邊開始連續(xù)8個數(shù)據(jù)頁,得到平均每個page的行數(shù),根據(jù)總的page個數(shù)預(yù)估出這個范圍的數(shù)據(jù)行數(shù)。

具體說,也就是取左右兩個葉子節(jié)點,以及從左葉子節(jié)點開始連續(xù)8個頁的數(shù)據(jù)做統(tǒng)計,中間可能有多個數(shù)據(jù)頁,但也會被忽略,這就是上面提到的“以偏概全”的方式。

這里面就存在一個最明顯的問題,也就是符合條件的數(shù)據(jù)頁面與預(yù)估時候采集的頁面的大小關(guān)系。

如果符合條件的數(shù)據(jù)頁的分布少于10個,當(dāng)然在預(yù)估的時候,會全部掃描這些page,當(dāng)然預(yù)估是完全精確的,這也是第一個查詢執(zhí)行計劃預(yù)估的實際行數(shù)完全不一致的原因。

如果符合條件的數(shù)據(jù)頁的分布大于10個,當(dāng)然在預(yù)估的時候,會部分掃描這些page,預(yù)估的誤差情況就此產(chǎn)生,這也是第二個查詢執(zhí)行計劃預(yù)估的實際行數(shù)差異較大的原因。

MySQL 統(tǒng)計信息以及執(zhí)行計劃預(yù)估方式初探

當(dāng)然MySQL的每個版本可能都有所改進或者差異,筆者并沒有從源碼中找到具體的算法,當(dāng)前測試的是5.7.20版本。

但目前仍不清楚,

1,在create_date字段上,時間是按照DATE_ADD(sysdate(), INTERVAL -rand()*2400 hour)生成的,從整體分布看,基本按照時間均勻分布的.

理論上根據(jù)這種方式推到,得到的預(yù)估結(jié)果偏差應(yīng)該不會很大,但尚不清楚為什么預(yù)估與實際存在如此大的差異。

2,嘗試找到預(yù)估值從精確到產(chǎn)生差異的臨界點,通過查詢實際行數(shù),根據(jù)key_len的值以及B樹索引的存儲原理(二級索引葉子節(jié)點存儲的二級索引的key值+聚集索引的key值).

理論上計算出來當(dāng)前查詢一個大概的取樣的page個數(shù),發(fā)現(xiàn)這個值預(yù)報理論上的10個page差異較大,可能是推到方式有問題,或者是MySQL預(yù)估本身有一些不知道的細(xì)節(jié)問題。

3,沒有詳細(xì)翻MySQL的源碼,尚未找到具體的實現(xiàn)細(xì)節(jié)。

對于有直方圖的數(shù)據(jù)庫來說,直方圖的信息也不是沒有代價,或者是萬能的,直方圖也有直方圖的局限性,這里暫不表述。

對于尚沒有直方圖的MySQL數(shù)據(jù)庫來說,其預(yù)估原理是每次查詢的時候進行對相關(guān)的數(shù)據(jù)頁面進行采樣預(yù)估的,而不是從直方圖中獲取到預(yù)估信息的,這是一個很消耗性能的操作。

詳情參考: http://www.orczhou.com/index.php/2013/04/how-mysql-choose-index-in-a-join/

這可能會導(dǎo)致MySQL不適合做較大數(shù)據(jù)量或者較為復(fù)雜的JOIN操作,當(dāng)然這也取決于具體的業(yè)務(wù)設(shè)計方案以及對數(shù)據(jù)的依賴程度,或者主觀上的查詢提示操作。

說這句話是冒著被MySQL的大神以及粉絲們怒噴的風(fēng)險的。

關(guān)于MySQL的預(yù)估的知識點,搜索到的文章并不是很多,也拘泥于個人的認(rèn)識有限,也希望對這方面有關(guān)注的大神多多指點。

據(jù)說MySQL在8.0之后的版本中會加入直方圖信息,以及其他JOIN方式(除了LOOP JOIN),這可能對性能上有比較大的幫助。

參考鏈接 https://www.cnblogs.com/LBSer/p/3333881.html http://www.orczhou.com/index.php/2013/04/how-mysql-choose-index-in-a-join/

來自:http://www.importnew.com/28075.html

標(biāo)簽: MySQL 數(shù)據(jù)庫
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日本黄色精品| 日韩精品一区第一页| 亚洲精品网址| 桃色av一区二区| 欧美一区影院| 在线免费观看亚洲| 午夜国产一区二区| 水蜜桃精品av一区二区| 国产精品啊啊啊| 日本久久一区| 日本亚洲最大的色成网站www| 日韩动漫一区| 国产视频一区二区在线播放| 免费观看在线综合| 999久久久精品国产| 国产99在线| 91偷拍一区二区三区精品| 国产精品日韩精品在线播放| 亚洲男女自偷自拍| 日本韩国欧美超级黄在线观看| 精品午夜视频| 日韩av在线播放网址| 久久精品国产亚洲一区二区三区| 欧美三级第一页| 久久99免费视频| 美女视频网站久久| 国产精品蜜芽在线观看| 亚洲二区在线| 尤物在线精品| 最新亚洲激情| 亚洲制服一区| 国产精品大片免费观看| 免费在线成人| 久久精品一区二区国产| 日韩动漫一区| 国产专区精品| 蜜桃tv一区二区三区| 国产精品呻吟| 日韩不卡在线观看日韩不卡视频 | 精品少妇av| 日本va欧美va欧美va精品| 一区二区三区四区在线观看国产日韩 | 欧美日韩亚洲一区在线观看| 最近高清中文在线字幕在线观看1| 欧美高清一区| 蜜桃av一区二区在线观看| 欧美一区免费| 尤物网精品视频| 欧美精品中文字幕亚洲专区| 蜜桃精品在线| 一区二区三区午夜视频| 国产成人免费精品| 亚洲影视一区| 欧美综合另类| 美腿丝袜在线亚洲一区| 国产一区二区高清| 久久97视频| 深夜日韩欧美| 久久久国产精品一区二区中文| 亚洲专区一区| 精品久久97| 欧美日韩国产探花| 久久激情婷婷| 青青青免费在线视频| 国产精品片aa在线观看| 在线精品观看| 国产一区日韩欧美| 美女国产一区二区三区| 四虎影视精品| 久久精品一区二区三区中文字幕| 久久成人国产| 午夜精品免费| 1024精品久久久久久久久| 成人在线超碰| 日韩成人a**站| 日本不卡视频在线观看| 伊人精品一区| 国产一区二区精品久| 久久精品72免费观看| 另类激情亚洲| 免费观看久久久4p| 视频一区二区中文字幕| 久久国产精品久久w女人spa| 亚洲综合国产| 国产农村妇女精品一区二区| 欧美精品一二| 亚洲一区二区av| 婷婷综合成人| 欧美欧美黄在线二区| 国产日产精品一区二区三区四区的观看方式 | 欧美va天堂在线| 亚洲精品一区二区在线看| 影视先锋久久| 亚洲欧洲一区| 亚洲精选成人| 蜜桃精品视频| 久久精品青草| 蜜臀久久99精品久久久画质超高清 | 日韩有码av| 久久伊人亚洲| 国产字幕视频一区二区| 久久国产视频网| 久久精品系列| 日韩精品91| 在线一区欧美| 国产探花在线精品| 日韩精品专区| 婷婷五月色综合香五月| 精品色999| 999在线观看精品免费不卡网站| 日韩国产欧美三级| 色吊丝一区二区| 亚洲精品在线a| 欧美成人精品午夜一区二区| 福利精品在线| 六月天综合网| 精品99在线| 亚洲人亚洲人色久| 色综合五月天| 91大神在线观看线路一区| 久久久久久婷| 男女性色大片免费观看一区二区| 精品资源在线| 欧美一区二区三区久久| 午夜欧美精品| 中文字幕人成乱码在线观看| 日韩精品中文字幕吗一区二区 | bbw在线视频| 91久久精品无嫩草影院| 亚洲欧美网站| 精品高清久久| 国产精品入口久久| 日韩国产一区二| 亚洲在线成人| 一本色道精品久久一区二区三区| 国产精品久久久久久久久久白浆| 亚洲一区二区三区高清不卡| 日韩一区欧美| 99久久婷婷| 狠狠久久伊人中文字幕| 国产精品视频一区二区三区 | 少妇精品导航| 日本欧美不卡| 四虎影视精品| 精品美女视频 | 亚洲成人不卡| 99久久精品国产亚洲精品| 色婷婷精品视频| 日韩欧美不卡| 欧美aa一级| 精品中文字幕一区二区三区av| 精品视频高潮| 国产精品99一区二区三| 日韩国产在线| 欧美va亚洲va日韩∨a综合色| 精品欧美激情在线观看| av不卡免费看| 日韩影院在线观看| 日韩精品1区2区3区| 国产精品xxx| 日韩免费高清| 日本欧美在线看| 国产欧美一区| jizzjizz中国精品麻豆| 欧美va亚洲va日韩∨a综合色| 午夜精品影院| 亚洲精品无播放器在线播放| 久久影视三级福利片| 在线日韩欧美| 婷婷五月色综合香五月| 国产不卡一区| 香蕉久久久久久久av网站| 美腿丝袜亚洲三区| 欧美日韩一区二区综合| 蜜臀国产一区二区三区在线播放| 精品视频网站| 99久久99视频只有精品 | 欧美激情三区| 国产亚洲高清视频| 国产美女久久| 久久三级视频| 欧美片网站免费| 日本在线精品| 国产精品久久久久久久免费软件| 亚洲成人不卡| 欧美日一区二区在线观看| 日本久久成人网| 国产精品亚洲欧美一级在线| 精品1区2区3区4区| а√天堂8资源中文在线| 国产乱码精品一区二区亚洲| 丝袜诱惑制服诱惑色一区在线观看 | 国产精品美女久久久久久不卡| 99在线|亚洲一区二区| 日韩av有码| 日韩av中文在线观看| 日韩中文字幕麻豆| 99热精品在线观看| 欧美日韩一区二区三区视频播放| 国产精品探花在线观看|