精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

設計MySQL的大叔為何偏愛ref?

數據庫 MySQL
對于一個查詢來說,有時候可以通過不同的索引或者全表掃描來執行它,MySQL優化器會通過事先生成的統計數據,或者少量訪問B+樹索引的方式來分析使用各個索引時都需要掃描多少條記錄,然后計算使用不同索引的查詢成本,最后選擇成本最低的那個來執行查詢。

 回憶一下查詢成本

對于一個查詢來說,有時候可以通過不同的索引或者全表掃描來執行它,MySQL優化器會通過事先生成的統計數據,或者少量訪問B+樹索引的方式來分析使用各個索引時都需要掃描多少條記錄,然后計算使用不同索引的查詢成本,最后選擇成本最低的那個來執行查詢。

[[326726]]

小貼士:我們之前稱那種通過少量訪問B+樹索引來分析需要掃描的記錄數量的方式稱為index dive,不知道大家還有沒有印象。

一個很簡單的思想就是:使用某個索引執行查詢時,需要掃描的記錄越少,就越可能使用這個索引來執行查詢。

創建場景

假如我們現在有一個表t,它的表結構如下所示:

  1. CREATE TABLE t ( 
  2.     id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
  3.     key1 VARCHAR(100), 
  4.     common_field VARCHAR(100), 
  5.     INDEX idx_key1 (key1) 
  6. ) ENGINE=InnoDB CHARSET=utf8; 

這個表包含3個列:

  • id列是自增主鍵
  • key1列用于存儲字符串,我們為key1列建立了一個普通的二級索引
  • common_field列用于存儲字符串

現在該表中共有10000條記錄:

  1. mysql> SELECT COUNT(*) FROM t; 
  2. +----------+ 
  3. COUNT(*) | 
  4. +----------+ 
  5. |    10000 | 
  6. +----------+ 
  7. 1 row in set (2.65 sec) 

其中key1列為'a'的記錄有2310條:

  1. mysql> SELECT COUNT(*) FROM t WHERE key1 = 'a'
  2. +----------+ 
  3. COUNT(*) | 
  4. +----------+ 
  5. |     2310 | 
  6. +----------+ 
  7. 1 row in set (0.83 sec) 

key1列在'a'到'i'之間的記錄也有2310條:

  1. mysql> SELECT COUNT(*) FROM t WHERE key1 > 'a' AND key1 < 'i'
  2. +----------+ 
  3. COUNT(*) | 
  4. +----------+ 
  5. |     2310 | 
  6. +----------+ 
  7. 1 row in set (1.31 sec) 

現在我們有如下兩個查詢:

  1. 查詢1:SELECT * FROM t WHERE key1 = 'a'
  2.  
  3. 查詢2:SELECT * FROM t WHERE key1 > 'a' AND key1 < 'i'

按理說上邊兩個查詢需要掃描的記錄數量是一樣的,MySQL查詢優化器對待它們的態度也應該是一樣的,也就是要么都使用二級索引idx_key1執行它們,要么都使用全表掃描的方式來執行它們。不過現實是貌似查詢優化器更喜歡查詢1,而比較討厭查詢2。查詢1的執行計劃如下所示:

  1. # 查詢1的執行計劃 
  2. mysql> EXPLAIN SELECT * FROM t WHERE key1 = 'a'\G 
  3. *************************** 1. row *************************** 
  4.            id: 1 
  5.   select_type: SIMPLE 
  6.         table: t 
  7.    partitions: NULL 
  8.          type: ref 
  9. possible_keys: idx_key1 
  10.           key: idx_key1 
  11.       key_len: 303 
  12.           ref: const 
  13.          rows: 2310 
  14.      filtered: 100.00 
  15.         Extra: NULL 
  16. 1 row in set, 1 warning (0.04 sec) 

查詢2的執行計劃如下所示:

  1. # 查詢2的執行計劃 
  2. mysql> EXPLAIN SELECT * FROM t WHERE key1 > 'a' AND key1 < 'i'\G 
  3. *************************** 1. row *************************** 
  4.            id: 1 
  5.   select_type: SIMPLE 
  6.         table: t 
  7.    partitions: NULL 
  8.          type: ALL 
  9. possible_keys: idx_key1 
  10.           keyNULL 
  11.       key_len: NULL 
  12.           ref: NULL 
  13.          rows: 9912 
  14.      filtered: 23.31 
  15.         Extra: Using where 
  16. 1 row in set, 1 warning (0.03 sec) 

很顯然,查詢優化器決定使用idx_key1二級索引執行查詢1,而使用全表掃描來執行查詢2。

為什么?憑什么?同樣是掃描相同數量的記錄,憑什么我range訪問方法就要比你ref低一頭?設計MySQL的大叔,你為何這么偏心...

解密偏心原因

世界上沒有無緣無故的愛,也沒有無緣無故的恨。這事兒還得從索引結構說起。比方說idx_key1二級索引結構長這樣:

 

原諒我們把索引對應的B+樹結構弄了一個極度精簡版,我們忽略掉了頁的結構,只保留了葉子節點的記錄。雖然極度精簡,但是我們還是保留了一個極其重要的特性:B+樹葉子節點中的記錄是按照索引列的值從小到大排序的。對于二級索引idx_key1來說:

  • 二級索引葉子節點的記錄只保留key1列和id列
  • 二級索引記錄是先按照key1列的值從小到大的順序進行排序的。
  • 如果key1列的值相同,則按照主鍵值,也就是id列的值從小到大的順序進行排序。

也就是說,對于所有key1值為'a'的二級索引記錄來說,它們都是按照id列的值進行排序的。對于查詢1:

  1. 查詢1: SELECT * FROM t WHERE key1 = 'a'

由于查詢列表是* ,也就是說我們需要通過讀取到的二級索引記錄的id值執行回表操作,到聚簇索引中找到完整的用戶記錄(為了去獲取common_field列的值)后才可以將記錄發送到客戶端。對于所有key1列值等于'a'的二級索引記錄,由于它們是按照id列的值排序的,所以:

  • 前一次回表的id值所屬的聚簇索引記錄和下一次回表的id值所屬的聚簇索引記錄很大可能在同一個數據頁中
  • 即使前一次回表的id值所屬的聚簇索引記錄和下一次回表的id值所屬的聚簇索引記錄不在同一個數據頁中,由于回表的id值是遞增的,所以我們很大可能通過順序I/O的方式找到下一個數據頁,也就是說這個過程中很大可能不需要很大幅度的移動磁頭就可以找到下一個數據頁。這可以減少很多隨機I/O帶來的性能開銷。

綜上所述,執行語句1時,回表操作帶來的性能開銷較小。

而對于查詢2來說:

  1. 查詢2: SELECT * FROM t WHERE key1 > 'a' AND key1 < 'i'

由于需要掃描的二級索引記錄對應的id值是無序的,所以執行回表操作時,需要訪問的聚簇索引記錄所在的數據頁很大可能就是無序的,這樣會造成很多隨機I/O。所以如果使用idx_key1來執行查詢1和查詢2,執行查詢1的成本很顯然會比查詢2低,這也是設計MySQL的大叔更鐘情于ref而不是range的原因。

MySQL的內部實現

MySQL優化器在計算回表的成本時,在使用二級索引執行查詢并且需要回表的情境下,對于ref和range是很明顯的區別對待的:

  • 對于range來說,需要掃描多少條二級索引記錄,就相當于需要訪問多少個頁面。每訪問一個頁面,回表的I/O成本就加1。

比方對于查詢2來說,需要回表的記錄數是2310,因為回表操作而計算的I/O成本就是2310。

  • 對于ref來說,回表開銷帶來的I/O成本存在天花板,也就是定義了一個上限值:
  1. double worst_seeks; 

這個上限值的取值是從下邊兩個值中取較小的那個:

比方對于查詢1來說,回表的記錄數是2310,按理說計算因回表操作帶來的I/O成本也應該是2310。但是由于對于ref訪問方法,計算回表操作時帶來的I/O成本時存在天花板,會從全表記錄的十分之一(也就是9912/10=991,9912為估計值)以及聚簇索引所占頁面的3倍(本例中聚簇索引占用的頁面數就是97,乘以3就是291)選擇更小的那個,本例中也就是291。

  • 全表記錄數的十分之一(此處的全表記錄數屬于統計數據,是一個估計值)
  • 聚簇索引所占頁面的3倍

小貼士:在成本分析的代碼中,range和index、all是被分到一類里的,ref是親兒子,單獨分析了一波。不過我們也可以看到,設計MySQL的大叔在計算range訪問方法的代價時,直接認為每次回表都需要進行一次頁面I/O,這是十分粗暴的,何況我們的實際聚簇索引總共才97個頁面,它卻將回表成本計算為2310,這也是很不精確的。當然,由于目前的算法無法預測哪些頁面在內存中,哪些不在,所以也就將就將就用吧~

責任編輯:武曉燕 來源: 我們都是小青蛙
相關推薦

2025-02-08 09:30:00

2013-02-18 10:03:20

CIO云計算CFO

2016-10-09 14:01:27

X86ARMLinux

2017-02-28 15:08:08

架構微服務數據庫

2015-11-02 20:57:00

劉積仁

2010-10-28 18:03:43

2010-11-11 10:50:44

2024-12-05 08:16:32

2017-08-07 11:24:02

互聯網

2015-03-25 10:59:55

javascriptjavascript編編程題題解

2012-03-27 22:53:40

三星

2025-06-26 02:29:00

C語言void*機制

2017-12-12 08:32:14

代碼蝴蝶效應系統

2013-08-02 14:10:24

移動App交互設計

2022-02-22 08:48:49

AgentClient主機

2018-01-16 23:00:50

云計算云服務器云服務

2024-04-18 00:22:10

設計模式接口代碼

2014-12-11 09:43:34

2015-10-20 11:20:18

云計算OpenStack云遷移

2024-02-02 11:03:11

React數據Ref
點贊
收藏

51CTO技術棧公眾號

欧美精品生活片| 欧美午夜理伦三级在线观看| 国产精品久久亚洲7777| 国产精品suv一区二区69| 欧美一区自拍| 色欧美片视频在线观看| 婷婷久久青草热一区二区| 在线观看毛片视频| 欧美色图首页| 国产一区二区三区丝袜| 成人高清在线观看视频| 96av在线| 中文字幕一区二区三区色视频| 丝袜情趣国产精品| 性猛交╳xxx乱大交| 亚洲成人人体| 一区二区三区四区高清精品免费观看| 国产成人欧美在线观看| 强制高潮抽搐sm调教高h| 成人自拍在线| 欧美日韩一区二区在线观看| 自拍偷拍亚洲色图欧美| 色呦呦免费观看| 国内精品视频666| 久久免费视频网站| 国产馆在线观看| 欧美绝顶高潮抽搐喷水合集| 欧美二区乱c少妇| 婷婷丁香激情网| 波多野结衣在线高清| 国产精品素人一区二区| 国产一区免费观看| av av片在线看| 蜜臀精品一区二区三区在线观看 | 天天影视欧美综合在线观看| 日韩av在线网| 中文字幕人妻一区二区三区| 日韩毛片网站| 欧美日韩大陆一区二区| www.欧美日本| 88xx成人免费观看视频库| 亚洲成人自拍一区| 亚洲精品无码国产| 国产高清在线a视频大全 | 九色综合日本| 亚洲女同志亚洲女同女播放| 激情五月婷婷综合网| 国产精品爽爽爽| 成人午夜精品视频| 青椒成人免费视频| 国产精品扒开腿爽爽爽视频| 人人草在线观看| 久久久夜夜夜| 国产精品成人品| 五月激情丁香网| 久久xxxx精品视频| 青青草国产精品一区二区| 日本中文在线播放| 免费欧美在线| 国产精品福利片| 中文字幕在线视频免费| 蜜臂av日日欢夜夜爽一区| 国产欧美日韩91| 亚洲天堂2021av| 韩日av一区二区| 97人人模人人爽人人喊38tv| 亚洲第一色视频| 99这里只有久久精品视频| 久久大香伊蕉在人线观看热2| 中文天堂在线资源| 男人的j进女人的j一区| 国产日韩亚洲欧美| 国产熟女一区二区三区四区| 成人综合在线视频| 精品网站在线看| 麻豆影视在线| 亚洲欧洲日韩av| 妺妺窝人体色www看人体| 波多野结衣中文字幕久久| 日韩欧美成人精品| 污污动漫在线观看| 免费一级欧美片在线观看网站| 一本久久精品一区二区| 116极品美女午夜一级| 国产一区一一区高清不卡| 欧美久久免费观看| 99久久人妻精品免费二区| 国产亚洲欧美日韩在线观看一区二区| 欧美大片国产精品| 国产精品久久久免费观看| 欧美亚洲激情| 欧美精品videosex性欧美| 美女又爽又黄免费视频| 激情综合一区二区三区| 久久精品国产99精品国产亚洲性色| 国产老妇伦国产熟女老妇视频| 每日更新成人在线视频| 国产在线精品播放| 丰满熟妇乱又伦| 久久久久久亚洲综合| 一区二区国产日产| 高潮在线视频| 欧美久久久久久久久| 黄色片视频免费观看| 91影院成人| 欧美中文字幕在线播放| 国产一区二区在线视频聊天| 97国产精品videossex| 在线天堂一区av电影| 久草在线资源站手机版| 欧美精品久久久久久久多人混战| 日日躁夜夜躁aaaabbbb| 亚洲精品在线播放| 日韩中文理论片| 天堂а√在线中文在线新版| 久久66热偷产精品| 日韩av大全| av蜜臀在线| 日韩一区二区中文字幕| 免费看裸体网站| 国产精品久久久久久久免费软件 | 国产不卡高清在线观看视频| 久久精品magnetxturnbtih| 亚洲综合图区| 欧美久久免费观看| 九九九视频在线观看| 国产美女诱惑一区二区| 国产精品久久久一区二区三区| 视频一区二区三区国产| 亚洲免费资源在线播放| 午夜dv内射一区二区| 欧美成人午夜77777| 久久91精品国产91久久跳| 免费看av在线| 国产视频一区二区在线| 日韩精品一区二区三区久久| 精品亚洲自拍| 97香蕉久久超级碰碰高清版 | 免费一级做a爰片久久毛片潮| 自拍偷拍欧美一区| 久久久伊人日本| 粉嫩av一区二区夜夜嗨| 综合久久国产九一剧情麻豆| 91精品无人成人www| av永久不卡| 国产精品v片在线观看不卡| 欧美巨乳在线| 色婷婷精品久久二区二区蜜臀av| 老司机午夜av| 免费av一区二区三区四区| 午夜精品福利视频| 欧日韩在线视频| 午夜av一区二区三区| 中文字幕在线播放视频| 亚洲免费高清| 精品一区二区国产| 日本在线播放一二三区| 日韩精品中文字幕在线观看| www五月天com| 中文字幕久久午夜不卡| 无尽裸体动漫2d在线观看| 国产精品二区不卡| 亚洲精品欧美日韩专区| 免费在线观看的电影网站| 精品久久久久香蕉网| 天堂资源在线播放| 91老师片黄在线观看| 黄色av免费在线播放| 清纯唯美日韩| 亚洲aa中文字幕| av在线app| 亚洲第一福利网| 一级黄色在线视频| 国产精品欧美一级免费| 亚洲精品国产久| 在线播放日韩| 亚欧洲精品在线视频免费观看| 青草视频在线免费直播| 337p日本欧洲亚洲大胆色噜噜| 成人午夜免费影院| 国产精品18久久久久久久久久久久| 欧美一卡2卡3卡4卡无卡免费观看水多多| 精品自拍一区| 日韩欧美国产系列| 国产精品视频久久久久久久| 国产欧美日本一区二区三区| 九九久久久久久| 99成人免费视频| 亚洲黄色成人久久久| 日韩精品成人在线观看| 26uuu久久噜噜噜噜| 一级毛片视频在线| 亚洲国产精品推荐| 又骚又黄的视频| 午夜欧美大尺度福利影院在线看 | 欧美日韩a v| 最新国产成人在线观看| 亚洲精品久久一区二区三区777| 91精品国产福利在线观看麻豆| 奇米4444一区二区三区| 高清中文字幕一区二区三区| 日韩午夜小视频| 国产情侣呻吟对白高潮| 亚洲影视资源网| 成年人视频软件| 91在线一区二区| 中文字幕一二三区| 日本亚洲视频在线| 成人免费观看视频在线观看| 欧美三区不卡| 精品少妇人妻av一区二区| 宅男在线一区| 久久精品国产美女| 视频在线观看免费影院欧美meiju 视频一区中文字幕精品 | 少妇一级淫免费播放| 黄色成人在线网址| 色播亚洲视频在线观看| 久草在线综合| 99精彩视频| 韩国理伦片久久电影网| 777777777亚洲妇女| 日韩特级毛片| 久久久精品视频在线观看| 久久视频www| 日韩精品中文字幕在线| 蜜臀久久精品久久久久| 91精品国产福利| 一级片在线免费观看视频| 色琪琪一区二区三区亚洲区| 男人午夜免费视频| 亚洲第一福利一区| 久久国产精品二区| 一区二区欧美视频| www青青草原| 亚洲免费毛片网站| 波多野结衣久久久久| 国产精品无人区| www中文在线| 国产精品乱码人人做人人爱 | 成人h动漫免费观看网站| 成人久久久久久久| 日韩欧美专区| 成人在线一区二区| 精品国产鲁一鲁****| 亚洲www在线| av成人综合| 国产精品免费视频一区二区 | seseavlu视频在线| 日韩精品在线观| 日韩a在线观看| 亚洲视频第一页| av女优在线| 日韩有码视频在线| 婷婷av在线| 性欧美xxxx交| 欧美电影免费观看高清完整| 国产成人亚洲综合青青| 欧美在线va视频| 国产色综合天天综合网| 在线观看亚洲精品福利片| 91免费精品视频| www.成人网| 欧美日韩在线精品| 久久亚洲成人| 嫩草影院中文字幕| 日韩视频在线一区二区三区 | 亚洲第一黄色网| 头脑特工队2在线播放| 亚洲一级黄色av| 久草中文在线| 国产做受69高潮| 亚洲一区二区三区四区| 成人黄色av播放免费| 欧美久久亚洲| 精品国产一二| 国内黄色精品| 亚洲第一精品区| 国色天香一区二区| 免费大片在线观看| 国产自产v一区二区三区c| 99久久久无码国产精品性波多 | 在线电影院国产精品| www久久久com| 亚洲欧美一区二区三区久久| 免费的黄网站在线观看| 高清视频欧美一级| 97欧美成人| av日韩中文字幕| 国产真实有声精品录音| 毛片av在线播放| 免费xxxx性欧美18vr| 中文字幕无码毛片免费看| 99久久精品国产毛片| 激情五月深爱五月| 亚洲成人动漫精品| 国产精品欧美激情在线| 日韩电影在线观看永久视频免费网站| 欧美一区二区黄片| 日韩一区二区在线视频| 日本乱码一区二区三区不卡| 91精品美女在线| 久久不见久久见中文字幕免费| 久久国产精品精品国产色婷婷| 91国内精品白嫩初高生| 日本在线播放不卡| 欧美激情五月| 丁香婷婷激情网| 不卡的电视剧免费网站有什么| 国产人妻黑人一区二区三区| 日本一区二区三区在线不卡| 黄色激情视频在线观看| 欧美另类一区二区三区| 三级无遮挡在线观看| 欧美精品九九久久| 国产精品一区二区精品| 色涩成人影视在线播放| 日韩亚洲精品在线| 美女被爆操网站| 亚洲婷婷在线视频| 中文字幕一区二区三区波野结| 欧美日韩国产一二三| 免费a级毛片在线观看| 97国产suv精品一区二区62| 国产高清日韩| 三年中文高清在线观看第6集| 久久久久美女| 三上悠亚av一区二区三区| 337p粉嫩大胆色噜噜噜噜亚洲| 免费看的黄色网| 日本高清成人免费播放| 天堂中文在线8| 国模极品一区二区三区| 国产成年精品| 亚洲美女自拍偷拍| 久久er99精品| 国产成人av免费在线观看| 欧美日韩在线播放三区四区| 成人福利在线| 国产美女搞久久| 日本久久一二三四| 亚洲国产高清av| 国产精品免费看片| 在线观看国产黄| 久久久精品国产| 亚洲视频一起| 国产精品又粗又长| www.成人网.com| 国产 日韩 欧美 在线| 亚洲免费av片| 色成人免费网站| 一区二区免费电影| 国产原创一区二区三区| 欧美人禽zoz0强交| 精品福利在线导航| 欧美少妇网站| 四虎永久国产精品| 精品一区二区三区久久| 乱h高h女3p含苞待放| 精品蜜桃在线看| 涩涩视频在线| 亚洲一卡二卡区| 国产成人在线视频网站| 天天操天天射天天爽| 亚洲欧美国产一本综合首页| 亚洲一区二区三区四区| 久久久成人精品一区二区三区| 久久久蜜桃一区二区人| 亚洲码无人客一区二区三区| 欧美色区777第一页| av网站大全在线| 久久综合中文色婷婷| 蜜臀国产一区二区三区在线播放| 右手影院亚洲欧美| 色av一区二区| 黄av在线播放| 九九九热999| 青青草国产成人av片免费| 欧美黑人精品一区二区不卡| 亚洲精品www久久久| 激情久久99| 欧美乱大交xxxxx潮喷l头像| 久久精品亚洲精品国产欧美| 国产又粗又长视频| 91成人在线播放| 欧美gayvideo| 免费a v网站| 91麻豆精品国产91久久久| yellow字幕网在线| 亚欧洲精品在线视频免费观看| 久久精品一区| 97成人资源站| 亚洲人成网站色ww在线| 日本99精品| 老司机午夜av| 亚洲愉拍自拍另类高清精品| 欧美孕妇孕交| 国产成人精品免费视频大全最热 | 88xx成人精品| 天天精品视频| 在线观看福利片|