欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > 淺談MySQL的B樹索引與索引優化小結

淺談MySQL的B樹索引與索引優化小結

熱門標簽:中科嘉智人工智能電銷機器人 上海智能外呼系統需要多少錢 西安400電話在哪里辦理 做地圖標注都需要什么工具 銀川電銷外呼系統定制 凱立德科技館地圖標注 電銷機器人好品牌門薩維l 甘孜電話機器人廠家 哈爾濱crm外呼系統價格

MySQL的MyISAM、InnoDB引擎默認均使用B+樹索引(查詢時都顯示為“BTREE”),本文討論兩個問題:

  1. 為什么MySQL等主流數據庫選擇B+樹的索引結構?
  2. 如何基于索引結構,理解常見的MySQL索引優化思路?

為什么索引無法全部裝入內存

索引結構的選擇基于這樣一個性質:大數據量時,索引無法全部裝入內存。

為什么索引無法全部裝入內存?假設使用樹結構組織索引,簡單估算一下:

  1. 假設單個索引節點12B,1000w個數據行,unique索引,則葉子節點共占約100MB,整棵樹最多200MB。
  2. 假設一行數據占用200B,則數據共占約2G。

假設索引存儲在內存中。也就是說,每在物理盤上保存2G的數據,就要占用200MB的內存,索引:數據的占用比約為1/10。1/10的占用比算不算大呢?物理盤比內存廉價的多,以一臺內存16G硬盤1T的服務器為例,如果要存滿1T的硬盤,至少需要100G的內存,遠大于16G。

考慮到一個表上可能有多個索引、聯合索引、數據行占用更小等情況,實際的占用比通常大于1/10,某些時候能達到1/3。在基于索引的存儲架構中,索引:數據的占用比過高,因此,索引無法全部裝入內存。

其他結構的問題

由于無法裝入內存,則必然依賴磁盤(或SSD)存儲。而內存的讀寫速度是磁盤的成千上萬倍(與具體實現有關),因此,核心問題是“如何減少磁盤讀寫次數”。

首先不考慮頁表機制,假設每次讀、寫都直接穿透到磁盤,那么:

  1. 線性結構:讀/寫平均O(n)次
  2. 二叉搜索樹(BST):讀/寫平均O(log2(n))次;如果樹不平衡,則最差讀/寫O(n)次
  3. 自平衡二叉搜索樹(AVL):在BST的基礎上加入了自平衡算法,讀/寫最大O(log2(n))次
  4. 紅黑樹(RBT):另一種自平衡的查找樹,讀/寫最大O(log2(n))次

BST、AVL、RBT很好的將讀寫次數從O(n)優化到O(log2(n));其中,AVL和RBT都比BST多了自平衡的功能,將讀寫次數降到最大O(log2(n))。

假設使用自增主鍵,則主鍵本身是有序的,樹結構的讀寫次數能夠優化到樹高,樹高越低讀寫次數越少;自平衡保證了樹結構的穩定。如果想進一步優化,可以引入B樹和B+樹。

B樹解決了什么問題

很多文章將B樹誤稱為B-(減)樹,這可能是對其英文名“B-Tree”的誤解(更有甚者,將B樹稱為二叉樹或二叉搜索樹)。特別是與B+樹一起講的時候。想當然的認為有B+(加)樹就有B-(減)樹,實際上B+樹的英文名是“B+-Tree”。

如果拋開維護操作,那么B樹就像一棵“m叉搜索樹”(m是子樹的最大個數),時間復雜度為O(logm(n))。然而,B樹設計了一種高效簡單的維護操作,使B樹的深度維持在約log(ceil(m/2))(n)~logm(n)之間,大大降低樹高。

再次強調:

不要糾結于時間復雜度,與單純的算法不同,磁盤IO次數才是更大的影響因素。讀者可以推導看看,B樹與AVL的時間復雜度是相同的,但由于B樹的層數少,磁盤IO次數少,實踐中B樹的性能要優于AVL等二叉樹。

同二叉搜索樹類似,每個節點存儲了多個key和子樹,子樹與key按順序排列。

頁表的目錄是擴展外存+加速磁盤讀寫,一個頁(Page)通常4K(等于磁盤數據塊block的大小,見inode與block的分析),操作系統每次以頁為單位將內容從磁盤加載到內存(以攤分尋道成本),修改頁后,再擇期將該頁寫回磁盤。考慮到頁表的良好性質,可以使每個節點的大小約等于一個頁(使m非常大),這每次加載的一個頁就能完整覆蓋一個節點,以便選擇下一層子樹;對子樹同理。對于頁表來說,AVL(或RBT)相當于1個key+2個子樹的B樹,由于邏輯上相鄰的節點,物理上通常不相鄰,因此,讀入一個4k頁,頁面內絕大部分空間都將是無效數據。

假設key、子樹節點指針均占用4B,則B樹節點最大m * (4 + 4) = 8m B;頁面大小4KB。則m = 4 * 1024 / 8m = 512,一個512叉的B樹,1000w的數據,深度最大 log(512/2)(10^7) = 3.02 ~= 4。對比二叉樹如AVL的深度為log(2)(10^7) = 23.25 ~= 24,相差了5倍以上。震驚!B樹索引深度竟然如此!

另外,B樹對局部性原理非常友好。如果key比較小(比如上面4B的自增key),則除了頁表的加成,緩存還能進一步預讀加速。美滋滋~

B+樹解決了什么問題

B樹的剩余問題

然而,如果要實際應用到數據庫的索引中,B樹還有一些問題:

  1. 未定位數據行
  2. 無法處理范圍查詢

問題1

數據表的記錄有多個字段,僅僅定位到主鍵是不夠的,還需要定位到數據行。有3個方案解決:

  1. 直接將key對應的數據行(可能對應多行)存儲子節點中。
  2. 數據行單獨存儲;節點中增加一個字段,定位key對應數據行的位置。
  3. 修改key與子樹的判斷邏輯,使子樹大于等于上一key小于下一key,最終所有訪問都將落于葉子節點;葉子節點中直接存儲數據行或數據行的位置。

方案1直接pass,存儲數據行將減少頁面中的子樹個數,m減小樹高增大。

方案2的節點中增加了一個字段,假設是4B的指針,則新的m = 4 * 1024 / 12m = 341.33 ~= 341,深度最大 log(341/2)(10^7) = 3.14 ~= 4。

方案3的節點m與深度不變,但時間復雜度變為穩定的O(logm(n))。

方案3可以考慮。

問題2

實際業務中,范圍查詢的頻率非常高,B樹只能定位到一個索引位置(可能對應多行),很難處理范圍查詢。改動較小的是2個

方案:

  1. 不改動;查詢的時候先查到左界,再查到右界,然后DFS(或BFS)遍歷左界、右界之間的節點。
  2. 在“問題1-方案3”的基礎上,由于所有數據行都存儲在葉子節點,B樹的葉子節點本身也是有序的,可以增加一個指針,指向當前葉子節點按主鍵順序的下一葉子節點;查詢時先查到左界,再查到右界,然后從左界到有界線性遍歷。

乍一看感覺方案1比方案2好——時間復雜度和常數項都一樣,方案1還不需要改動。但是別忘了局部性原理,不管節點中存儲的是數據行還是數據行位置,方案2的好處在于,依然可以利用頁表和緩存預讀下一節點的信息。而方案1則面臨節點邏輯相鄰、物理分離的缺點。

引出B+樹

綜上,問題1的方案2與問題2的方案1可整合為一種方案(基于B樹的索引),問題1的方案3與問題2的方案2可整合為一種(基于B+樹的索引)。實際上,數據庫、文件系統有些采用了B樹,有些采用B+樹。

由于某些猴子暫未明白的原因,包括MySQL在內的主流數據庫多選擇了B+樹。即:

主要變動如上所述:

  1. 修改key與子樹的組織邏輯,將索引訪問都落到葉子節點
  2. 按順序將葉子節點串起來(方便范圍查詢)

B樹和B+樹的增、刪、查過程

B樹的增刪過程暫時可參考從B樹、B+樹、B*樹談到R 樹的“6、B樹的插入、刪除操作”小節,B+樹的增刪同理。此處暫不贅述。

Mysql索引優化

根據B+樹的性質,很容易理解各種常見的MySQL索引優化思路。

暫不考慮不同引擎之間的區別。

優先使用自增key作為主鍵

前面的分析中,假設用4B的自增key作為索引,則m可達到512,層高僅有3。使用自增的key有兩個好處:

自增key一般為int等整數型,key比較緊湊,這樣m可以非常大,而且索引占用空間小。最極端的例子,如果使用50B的varchar(包括長度),那么m = 4 * 1024 / 54m = 75.85 ~= 76,深度最大 log(76/2)(10^7) = 4.43 ~= 5,再加上cache缺失、字符串比較的成本,時間成本增加較大。同時,key由4B增長到50B,整棵索引樹的空間占用增長也是極為恐怖的(如果二級索引使用主鍵定位數據行,則空間增長更加嚴重)。

自增的性質使得新數據行的插入請求必然落到索引樹的最右側,發生節點分裂的頻率較低,理想情況下,索引樹可以達到“滿”的狀態。索引樹滿,一方面層高更低,一方面刪除節點時發生節點合并的頻率也較低。

優化經歷:

猴子曾使用varchar(100)的列做過主鍵,存儲containerId,過了3、4天100G的數據庫就滿了,DBA小姐姐郵件里委婉表示了對我的鄙視。。。之后增加了自增列作為主鍵,containerId作為unique的二級索引,時間、空間優化效果相當顯著。

最左前綴匹配

索引可以簡單如一個列(a),也可以復雜如多個列(a, b, c, d),即聯合索引。如果是聯合索引,那么key也由多個列組成,同時,索引只能用于查找key是否存在(相等),遇到范圍查詢(>、、between、like左匹配)等就不能進一步匹配了,后續退化為線性查找。因此,列的排列順序決定了可命中索引的列數。

如有索引(a, b, c, d),查詢條件a = 1 and b = 2 and c > 3 and d = 4,則會在每個節點依次命中a、b、c,無法命中d。也就是最左前綴匹配原則。

=、in自動優化順序

不需要考慮=、in等的順序,mysql會自動優化這些條件的順序,以匹配盡可能多的索引列。

如有索引(a, b, c, d),查詢條件c > 3 and b = 2 and a = 1 and d 4與a = 1 and c > 3 and b = 2 and d 4等順序都是可以的,MySQL會自動優化為a = 1 and b = 2 and c > 3 and d 4,依次命中a、b、c。

索引列不能參與計算

有索引列參與計算的查詢條件對索引不友好(甚至無法使用索引),如from_unixtime(create_time) = '2014-05-29'。

原因很簡單,如何在節點中查找到對應key?如果線性掃描,則每次都需要重新計算,成本太高;如果二分查找,則需要針對from_unixtime方法確定大小關系。

因此,索引列不能參與計算。上述from_unixtime(create_time) = '2014-05-29'語句應該寫成create_time = unix_timestamp('2014-05-29')。

能擴展就不要新建索引

如果已有索引(a),想建立索引(a, b),盡量選擇修改索引(a)為索引(a, b)。

新建索引的成本很容易理解。而基于索引(a)修改為索引(a, b)的話,MySQL可以直接在索引a的B+樹上,經過分裂、合并等修改為索引(a, b)。

不需要建立前綴有包含關系的索引

如果已有索引(a, b),則不需要再建立索引(a),但是如果有必要,則仍然需考慮建立索引(b)。

選擇區分度高的列作索引

很容易理解。如,用性別作索引,那么索引僅能將1000w行數據劃分為兩部分(如500w男,500w女),索引幾乎無效。

區分度的公式是count(distinct col>) / count(*),表示字段不重復的比例,比例越大區分度越好。唯一鍵的區分度是1,而一些狀態、性別字段可能在大數據面前的區分度趨近于0。

這個值很難確定,一般需要join的字段要求是0.1以上,即平均1條掃描10條記錄。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • MySql如何查看索引并實現優化
  • MySQL如何基于Explain關鍵字優化索引功能
  • MySQL利用索引優化ORDER BY排序語句的方法
  • MySQL 函數索引的優化方案
  • Mysql索引性能優化問題解決方案
  • MySQL性能優化之如何高效正確的使用索引
  • 一篇文章掌握MySQL的索引查詢優化技巧
  • MySQL數據庫優化之索引實現原理與用法分析
  • MySQL中or、in、union與索引優化詳析
  • MySQL優化中B樹索引知識點總結
  • 分析Mysql表讀寫、索引等操作的sql語句效率優化問題
  • 淺談MySQL索引優化分析
  • MySQL如何優化索引

標簽:那曲 安徽 平頂山 山南 安康 濮陽 浙江 四川

巨人網絡通訊聲明:本文標題《淺談MySQL的B樹索引與索引優化小結》,本文關鍵詞  淺談,MySQL,的,樹,索引,與,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《淺談MySQL的B樹索引與索引優化小結》相關的同類信息!
  • 本頁收集關于淺談MySQL的B樹索引與索引優化小結的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    亚洲成人先锋电影| 丝袜诱惑亚洲看片| 成人一区二区三区| 欧美a级片免费看| 久久综合九色综合97婷婷| 秋霞午夜鲁丝一区二区老狼| youjizz.com日本| 欧美日韩一区三区| 亚洲综合自拍偷拍| 少妇献身老头系列| 欧美精品三级日韩久久| 亚洲亚洲精品在线观看| 最新国产精品自拍| 欧美二区乱c少妇| 亚洲超丰满肉感bbw| 人妻av一区二区| 欧美一卡二卡在线观看| 奇米影视一区二区三区| 欧美老熟妇乱大交xxxxx| 精品欧美黑人一区二区三区| 另类人妖一区二区av| 亚洲理论片在线观看| 久久精品人人做人人爽人人| 国产乱人伦精品一区二区在线观看| 女教师淫辱の教室蜜臀av软件| 久久精品男人的天堂| 国产美女精品人人做人人爽| 日韩精品一区二区三区在线视频| 中文字幕亚洲在| 91丝袜美腿高跟国产极品老师 | 97超碰在线资源| 久久蜜桃av一区精品变态类天堂| 国产精品一区二区三区乱码| 午夜激情福利网| 樱花草国产18久久久久| 视频免费在线观看| 久久综合九色欧美综合狠狠| 国产精品自产自拍| 在线日韩一区二区| 视频一区免费在线观看| a资源在线观看| 亚洲天堂久久久久久久| 99久久久无码国产精品性波多| 日韩免费视频一区| 国产91在线看| 欧美日韩精品久久久| 久久国产精品区| a在线视频播放观看免费观看| 亚洲一区二区在线观看视频| 在线免费观看成年人视频| 欧美国产一区二区在线观看| 91碰在线视频| 精品国产乱码久久久久久浪潮| 国产成人一区二区精品非洲| 欧美色视频一区| 紧缚捆绑精品一区二区| 欧洲第一无人区观看| 偷拍自拍另类欧美| 中文字幕无码日韩专区免费| 亚洲电影一区二区三区| 国产7777777| 亚洲午夜视频在线观看| 极品久久久久久久| 亚洲电影欧美电影有声小说| 国产探花视频在线播放| 一区二区三区在线观看欧美| 亚洲AV无码国产成人久久| 成人欧美一区二区三区白人| 国产伦精品一区二区三区妓女| 中文字幕av一区二区三区高 | 91日韩精品一区| 26uuu成人网一区二区三区| av激情综合网| 精品久久久久久久久久久久久久久 | 91国偷自产一区二区开放时间| 免费在线观看不卡| 在线观看免费亚洲| 国内不卡的二区三区中文字幕| 欧美日韩一区二区三区四区五区 | 欧美系列一区二区| 国产一区二区免费在线| 欧美精品在线观看一区二区| 丁香六月激情综合| 在线视频你懂得一区| 国产在线精品一区二区| 这里是久久伊人| 99久久er热在这里只有精品66| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 欧美在线影院一区二区| 国内久久婷婷综合| 日韩视频在线你懂得| 91蝌蚪porny| 国产精品无人区| 久久精品国产亚洲av麻豆| 亚洲制服丝袜一区| 中文字幕亚洲欧美日韩| 国产在线精品一区二区夜色| 日韩欧美自拍偷拍| 亚洲最大视频网| 亚洲男人的天堂av| 免费三级在线观看| 国产精品一区二区免费不卡| 日韩精品中文字幕在线不卡尤物 | 99re热这里只有精品免费视频 | 国内精品国产三级国产a久久| 欧美一级精品大片| 中文字幕99页| 一级日本不卡的影视| 色综合色狠狠综合色| 国产精品一区二区在线观看不卡| 精品欧美一区二区三区精品久久| 艳妇乳肉亭妇荡乳av| 亚洲在线免费播放| 欧美在线观看一二区| 99久久综合色| 国产精品高潮呻吟久久| 国产性生活大片| 国产成人免费视频| 日本一区二区三区久久久久久久久不| 国产真实乱人偷精品人妻| 免费成人美女在线观看.| 欧美一区二区啪啪| 亚洲av成人片色在线观看高潮 | 一二三区视频在线观看| 一区二区三区四区蜜桃| 在线免费观看不卡av| 91玉足脚交白嫩脚丫在线播放| 1024成人网| 91精品福利视频| 91偷拍与自偷拍精品| 一区二区欧美国产| 欧美区视频在线观看| 性活交片大全免费看| 亚洲成av人片在线观看| 欧美高清激情brazzers| 黄色短视频在线观看| 轻轻草成人在线| 精品国产一区二区精华| 中文字幕av久久爽一区| 国产精品99久久久久久有的能看 | 国产成人在线免费| 中文字幕一区视频| 欧美性做爰猛烈叫床潮| 女同性αv亚洲女同志| 日韩电影在线观看电影| 欧美变态凌虐bdsm| 国产视频123区| 成人激情开心网| 伊人夜夜躁av伊人久久| 欧美高清www午色夜在线视频| 青青草视频播放| 国精产品一区一区三区mba桃花| 国产日韩欧美高清在线| 91成人福利视频| 中文字幕1区2区| 奇米精品一区二区三区四区| 久久噜噜亚洲综合| 少妇影院在线观看| 日韩黄色一区二区| 久久99深爱久久99精品| 国产精品女人毛片| 欧美区在线观看| 日韩视频在线观看免费视频| 成人一区二区三区中文字幕| 亚洲国产美女搞黄色| 精品久久久久久久久久久久久久久久久 | 国产精品自在在线| 伊人婷婷欧美激情| 精品国产乱码久久久久久夜甘婷婷 | 日本一区二区三区在线免费观看| 亚洲444eee在线观看| 精品国产91洋老外米糕| 日本天堂中文字幕| 网站免费在线观看| 国产91高潮流白浆在线麻豆| 亚洲与欧洲av电影| 久久久久久久久97黄色工厂| 日本韩国视频一区二区| 强伦人妻一区二区三区| 成人禁用看黄a在线| 日韩不卡一区二区| 中文字幕一区二区视频| 欧美一卡二卡在线| 日本少妇高清视频| 国产偷人妻精品一区| 成人小视频在线| 日韩成人免费电影| 亚洲手机成人高清视频| 精品久久久久一区二区国产| 91黄色免费版| av男人的天堂av| 少妇性l交大片7724com| 国产综合色在线| 亚洲综合色婷婷| 日本一区二区免费在线| 91麻豆精品国产无毒不卡在线观看| 午夜成人亚洲理伦片在线观看| 看全色黄大色黄女片18| jlzzjlzz国产精品久久| 激情久久五月天|