衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

對(duì) B+ 樹(shù)與索引在 MySQL 中的認(rèn)識(shí)

數(shù)據(jù)分析與開(kāi)發(fā) ? 來(lái)源:博客園 ? 作者:AnnsShadoW ? 2021-11-08 11:11 ? 次閱讀

概述

本質(zhì):數(shù)據(jù)庫(kù)維護(hù)某種數(shù)據(jù)結(jié)構(gòu)以某種方式引用(指向)數(shù)據(jù)

索引取舍原則:索引的結(jié)構(gòu)組織要盡量減少查找過(guò)程中磁盤(pán)I/O的存取次數(shù)

B樹(shù)

滿足的條件

d為大于1的一個(gè)正整數(shù),稱(chēng)為B-Tree的度

h為一個(gè)正整數(shù),稱(chēng)為B-Tree的高度

每個(gè)非葉子節(jié)點(diǎn)由n-1個(gè)key和n個(gè)指針組成,其中d《=n《=2d

每個(gè)葉子節(jié)點(diǎn)最少包含一個(gè)key和兩個(gè)指針,最多包含2d-1個(gè)key和2d個(gè)指針,葉節(jié)點(diǎn)的指針均為null

所有葉節(jié)點(diǎn)具有相同的深度,等于樹(shù)高h(yuǎn)

key和指針互相間隔,節(jié)點(diǎn)兩端是指針

一個(gè)節(jié)點(diǎn)中的key從左到右非遞減排列

所有節(jié)點(diǎn)組成樹(shù)結(jié)構(gòu)

每個(gè)指針要么為null,要么指向另外一個(gè)節(jié)點(diǎn)

一個(gè)度為d的B-Tree,設(shè)其索引N個(gè)key,則其樹(shù)高h(yuǎn)的上限為logd((N+1)/2),檢索一個(gè)key查找節(jié)點(diǎn)的個(gè)數(shù)的漸進(jìn)復(fù)雜度為logd(N)

更新后的操作

插入刪除新的數(shù)據(jù)記錄會(huì)破壞B-Tree的性質(zhì),因此在插入刪除時(shí),需要對(duì)樹(shù)進(jìn)行一個(gè)分裂、合并、轉(zhuǎn)移等操作以保持B-Tree性質(zhì)

B+樹(shù)

bb7b4ebc-3fc2-11ec-9195-dac502259ad0.jpg

每個(gè)節(jié)點(diǎn)的指針上限為2d而不是2d+1

內(nèi)節(jié)點(diǎn)不存儲(chǔ)data,只存儲(chǔ)key

葉子節(jié)點(diǎn)不存儲(chǔ)指針

在經(jīng)典B+樹(shù)的基礎(chǔ)上,增加了順序訪問(wèn)指針--》提高區(qū)間訪問(wèn)的性能

為什么使用B/B+樹(shù)?

主存讀取

當(dāng)系統(tǒng)需要讀取主存時(shí),則將地址信號(hào)放到地址總線上傳給主存

主存讀到地址信號(hào)后,解析信號(hào)并定位到指定存儲(chǔ)單元,然后將此存儲(chǔ)單元數(shù)據(jù)放到數(shù)據(jù)總線上,供其它部件讀取

主存存取的時(shí)間僅與存取次數(shù)呈線性關(guān)系,因?yàn)椴淮嬖?a target="_blank">機(jī)械操作,兩次存取的數(shù)據(jù)的“距離”不會(huì)對(duì)時(shí)間有任何影響

磁盤(pán)存取原理

磁盤(pán)轉(zhuǎn)動(dòng),每個(gè)磁頭不動(dòng),負(fù)責(zé)讀取內(nèi)容

不過(guò)已經(jīng)有了多磁頭獨(dú)立技術(shù)

局部性原理

磁盤(pán)預(yù)讀:長(zhǎng)度一般以頁(yè)的整數(shù)倍為單位

MyISAM索引實(shí)現(xiàn)

使用B+樹(shù)作為索引結(jié)構(gòu),data存放數(shù)據(jù)記錄的地址

索引文件與數(shù)據(jù)文件分離

主索引和輔助索引(Secondary key)在結(jié)構(gòu)上沒(méi)有任何區(qū)別,只是主索引要求key是唯一的,而輔助索引的key可以重復(fù)

非聚集:MyISAM中索引檢索的算法為首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,則取出其data域的值,然后以data域的值為地址,讀取相應(yīng)數(shù)據(jù)記錄

.MYI文件的組成

整個(gè)索引文件的基本信息state

各索引的限制信息base

各索引的定義信息keydef

各索引記錄的概要信息recinfo

讀取索引的流程

query請(qǐng)求,直接讀取key cache中的cache block,有就返回

沒(méi)有就到.MYI文件中以file block方式讀取數(shù)據(jù)

再以相同的格式存取key cache

再將key cache中的數(shù)據(jù)返回

InnoDB索引實(shí)現(xiàn)

也是使用B+樹(shù)

第一個(gè)與MyISAM的不同點(diǎn)

第一個(gè)重大區(qū)別是InnoDB的數(shù)據(jù)文件本身就是索引文件,表數(shù)據(jù)文件本身就是按B+Tree組織的一個(gè)索引結(jié)構(gòu)

InnoDB的數(shù)據(jù)文件本身要按主鍵聚集

所以InnoDB要求表必須有主鍵(MyISAM可以沒(méi)有)

沒(méi)有顯式指定,自動(dòng)選擇唯一標(biāo)識(shí)列

不存在的話,生成6個(gè)字節(jié)長(zhǎng)整型的隱含字段

第二個(gè)與MyISAM的不同點(diǎn)

InnoDB的輔助索引data域存儲(chǔ)相應(yīng)記錄主鍵的值而不是地址

換句話說(shuō),InnoDB的所有輔助索引都引用主鍵作為data域

輔助索引搜索需要檢索兩遍索引:首先檢索輔助索引獲得主鍵,然后用主鍵到主索引中檢索獲得記錄

得出的優(yōu)化點(diǎn)

不建議使用過(guò)長(zhǎng)的字段作為主鍵,因?yàn)樗休o助索引都引用主索引,過(guò)長(zhǎng)的主索引會(huì)令輔助索引變得過(guò)大

用非單調(diào)的字段作為主鍵在InnoDB中也不好,因?yàn)镮nnoDB數(shù)據(jù)文件本身是一顆B+Tree,非單調(diào)的主鍵會(huì)造成在插入新記錄時(shí)數(shù)據(jù)文件為了維持B+Tree的特性而頻繁的分裂調(diào)整,十分低效,而使用自增字段作為主鍵就很不錯(cuò)了

聚簇索引鍵被更新造成的成本除了索引數(shù)據(jù)可能會(huì)移動(dòng),相關(guān)的所有記錄數(shù)據(jù)也要移動(dòng)

索引使用策略及優(yōu)化

全列匹配

按照索引中所有列進(jìn)行精確匹配(這里精確匹配指“=”或“IN”匹配)時(shí),索引可以被用到

理論上索引對(duì)順序是敏感的,但是由于MySQL的查詢優(yōu)化器會(huì)自動(dòng)調(diào)整where子句的條件順序以使用適合的索引

最左前綴匹配

當(dāng)查詢條件精確匹配索引的左邊連續(xù)一個(gè)或幾個(gè)列時(shí),索引可以被用到

查詢條件用到了索引中列的精確匹配,但是中間某個(gè)條件未提供

只能用到索引中,從中間斷開(kāi)前的列

應(yīng)對(duì)

可以增加輔助索引

當(dāng)中間條件選項(xiàng)較少時(shí),用隔離列的方式,使用IN包含

看情況,比較建立

查詢條件沒(méi)有指定索引第一列

不滿足使用索引的條件

匹配某列的前綴字符串

可以使用索引

如果通配符%不出現(xiàn)在開(kāi)頭,則可以用到索引,但根據(jù)具體情況不同可能只會(huì)用其中一個(gè)前綴

范圍查詢

范圍列可以用到索引(必須是最左前綴),但是范圍列后面的列無(wú)法用到索引

同時(shí),索引最多用于一個(gè)范圍列,因此如果查詢條件中有兩個(gè)范圍列則無(wú)法全用到索引

僅用explain可能無(wú)法區(qū)分范圍索引和多值匹配

查詢條件中含有函數(shù)/表達(dá)式

一般不使用哦

手工算好再代入

索引選擇性與前綴索引

MyISAM與InnoDB基數(shù)統(tǒng)計(jì)方式

MyisAM索引的基數(shù)值(Cardinality,show index 命令可以看見(jiàn))是精確的,InnoDB則是估計(jì)值

MyisAM統(tǒng)計(jì)信息是保存磁盤(pán)中,在alter表或Analyze table操作更新此信息

而InnoDB則是在表第一次打開(kāi)的時(shí)候估計(jì)值保存在緩存區(qū)內(nèi)

不建議建立索引的情況

表記錄比較少

索引的選擇性低:不重復(fù)的索引值(也叫基數(shù),Cardinality)與表記錄數(shù)(#T)的比值

前綴索引

用列的前綴代替整個(gè)列作為索引key,當(dāng)前綴長(zhǎng)度合適時(shí),可以做到既使得前綴索引的選擇性接近全列索引,同時(shí)因?yàn)樗饕齥ey變短而減少了索引文件的大小和維護(hù)開(kāi)銷(xiāo)

缺點(diǎn)

不能用于ORDER BY和GROUP BY操作

也不能用于Covering index(即當(dāng)索引本身包含查詢所需全部數(shù)據(jù)時(shí),不再訪問(wèn)數(shù)據(jù)文件本身)

InnoDB主鍵選擇與插入優(yōu)化

如果沒(méi)有特別的需要,請(qǐng)永遠(yuǎn)使用一個(gè)與業(yè)務(wù)無(wú)關(guān)的自增字段作為主鍵

InnoDB使用聚集索引,數(shù)據(jù)記錄本身被存于主索引(一顆B+Tree)的葉子節(jié)點(diǎn)上

這就要求同一個(gè)葉子節(jié)點(diǎn)內(nèi)(大小為一個(gè)內(nèi)存頁(yè)或磁盤(pán)頁(yè))的各條數(shù)據(jù)記錄按主鍵順序存放,因此每當(dāng)有一條新的記錄插入時(shí),MySQL會(huì)根據(jù)其主鍵將其插入適當(dāng)?shù)墓?jié)點(diǎn)和位置,如果頁(yè)面達(dá)到裝載因子(InnoDB默認(rèn)為15/16),則開(kāi)辟一個(gè)新的頁(yè)(節(jié)點(diǎn))

如果使用非自增主鍵,每次插入近似隨機(jī),容易引起數(shù)據(jù)的移動(dòng),重新讀目標(biāo)頁(yè)面,碎片也多了,雖然也可以用OPTIMIZE TABLE重建優(yōu)化,但麻煩啊

參考資料

圖片來(lái)源網(wǎng)絡(luò)

《高性能MySQL》

作者:AnnsShadoW

https://www.cnblogs.com/annsshadow/p/5355090.html

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 磁盤(pán)
    +關(guān)注

    關(guān)注

    1

    文章

    380

    瀏覽量

    25276
  • 數(shù)據(jù)庫(kù)
    +關(guān)注

    關(guān)注

    7

    文章

    3846

    瀏覽量

    64685
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    829

    瀏覽量

    26742

原文標(biāo)題:對(duì) B+ 樹(shù)與索引在 MySQL 中的認(rèn)識(shí)

文章出處:【微信號(hào):DBDevs,微信公眾號(hào):數(shù)據(jù)分析與開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    樹(shù)科技物聯(lián)網(wǎng)方面

    樹(shù)科技物聯(lián)網(wǎng)領(lǐng)域有多方面的涉及和發(fā)展,以下是一些具體信息: 傳感器技術(shù)合作 與傳感器公司合作:宇樹(shù)科技與一些傳感器技術(shù)公司有合作,例如奧比光為宇
    發(fā)表于 02-04 06:48

    使用插件將Excel連接到MySQL/MariaDB

    ,可以快速地將數(shù)據(jù)從 MySQL 或 MariaDB 加載到 Excel,立即從數(shù)據(jù)庫(kù)刷新 Excel 工作簿的數(shù)據(jù),編輯這些數(shù)據(jù),并將它們保存回 MySQL。之后您能夠像使用的 Excel 工作表一樣
    的頭像 發(fā)表于 01-20 12:38 ?120次閱讀
    使用插件將Excel連接到<b class='flag-5'>MySQL</b>/MariaDB

    創(chuàng)建唯一索引的SQL命令和技巧

    創(chuàng)建唯一索引時(shí),以下是一些SQL命令和技巧,可以幫助優(yōu)化性能: 使用合適的索引類(lèi)型:對(duì)于需要保證唯一性的列,使用UNIQUE索引來(lái)避免重復(fù)數(shù)據(jù)的插入。 這可以確保列
    的頭像 發(fā)表于 01-09 15:21 ?77次閱讀

    云服務(wù)器 Flexus X 實(shí)例 MySQL 應(yīng)用加速測(cè)試

    ? 小結(jié)論 ? 概要 探索華為云強(qiáng)大的云服務(wù)生態(tài)時(shí),我深入體驗(yàn)了 EulerOS 鏡像對(duì) MySQL 應(yīng)用的顯著加速效果。不僅簡(jiǎn)化了部署流程,更在性能上實(shí)現(xiàn)了質(zhì)的飛躍。恰逢華為云 828 B2B
    的頭像 發(fā)表于 12-24 12:19 ?221次閱讀
    云服務(wù)器 Flexus X 實(shí)例 <b class='flag-5'>MySQL</b> 應(yīng)用加速測(cè)試

    阿里國(guó)際推出全球首個(gè)B2B AI搜索引擎Accio

    近日,歐洲科技峰會(huì)Web Summit上,阿里國(guó)際正式推出了全球首個(gè)B2B領(lǐng)域的AI搜索引擎——Accio。這一創(chuàng)新產(chǎn)品面向全球商家開(kāi)放,標(biāo)志著阿里國(guó)際正式入局當(dāng)前備受矚目的AI Search賽道。
    的頭像 發(fā)表于 11-15 16:53 ?761次閱讀

    香港云服務(wù)器怎么部署MySQL數(shù)據(jù)庫(kù)?

    香港云服務(wù)器上部署MySQL數(shù)據(jù)庫(kù)的步驟如下: 步驟 1: 更新軟件包列表 首先,確保軟件包列表是最新的。終端執(zhí)行以下命令: sudo apt update 步驟 2: 安裝
    的頭像 發(fā)表于 11-14 16:15 ?228次閱讀

    MySQL編碼機(jī)制原理

    MyQL 編解碼機(jī)制介紹 問(wèn)題解答 讀者問(wèn)題簡(jiǎn)介 為敘述方便,以下的「我」指代讀者 我們知道 Java 是通過(guò) ?JDBC 來(lái)訪問(wèn)數(shù)據(jù)庫(kù)的,以訪問(wèn) MySQL 為例,需要配置以下 url 才能訪問(wèn)
    的頭像 發(fā)表于 11-09 11:01 ?299次閱讀

    MATLAB的矩陣索引

    對(duì)矩陣進(jìn)行索引是從矩陣中選擇或修改部分元素的一種方式。MATLAB 有幾種索引樣式,它們不僅功能強(qiáng)大、靈活,而且可讀性強(qiáng)、表現(xiàn)力強(qiáng)。矩陣是 MATLAB 用來(lái)組織和分析數(shù)據(jù)的一個(gè)核心組件,索引是以可理解的方式有效操作矩陣的關(guān)鍵。
    的頭像 發(fā)表于 09-05 09:28 ?537次閱讀
    MATLAB<b class='flag-5'>中</b>的矩陣<b class='flag-5'>索引</b>

    人工智能大模型公司卓世科技完成億元B+輪融資

    近日,國(guó)內(nèi)領(lǐng)先的人工智能大模型解決方案提供商卓世科技宣布成功完成億元級(jí)B+輪融資,此輪融資由業(yè)界知名投資機(jī)構(gòu)同創(chuàng)偉業(yè)領(lǐng)投,同時(shí)吸引了青島國(guó)資平臺(tái)青島海發(fā)及啟迪之星等重量級(jí)機(jī)構(gòu)的跟投,彰顯了資本市場(chǎng)對(duì)卓世科技人工智能領(lǐng)域創(chuàng)新實(shí)力及未來(lái)發(fā)展前景的高度認(rèn)可。
    的頭像 發(fā)表于 08-13 17:50 ?704次閱讀

    壹沓科技完成B+輪融資,加速大供應(yīng)鏈超自動(dòng)化進(jìn)程

    近日,全球領(lǐng)先的數(shù)字員工機(jī)器人公司——壹沓科技宣布成功完成B+輪融資,此輪融資由鼎暉VGC(創(chuàng)新與成長(zhǎng)基金)領(lǐng)投,新尚資本跟投,彰顯了資本市場(chǎng)對(duì)壹沓科技大供應(yīng)鏈領(lǐng)域超自動(dòng)化解決方案的高度認(rèn)可與信心。
    的頭像 發(fā)表于 08-09 18:13 ?1399次閱讀

    MySQL知識(shí)點(diǎn)匯總

    大家好,這部分被稱(chēng)為DQL部分,是每個(gè)學(xué)習(xí)MySQL必須要學(xué)會(huì)的部分,下面就讓我來(lái)介紹MySQL的其他部分。
    的頭像 發(fā)表于 08-05 15:27 ?451次閱讀
    <b class='flag-5'>MySQL</b>知識(shí)點(diǎn)匯總

    地芯科技完成近億元B+輪融,加速高端模擬射頻芯片發(fā)展

    近日,國(guó)內(nèi)領(lǐng)先的高端模擬射頻芯片研發(fā)企業(yè)——地芯科技,宣布成功完成近億元的B+輪融資。本輪融資由鴻富資產(chǎn)、九智資本及鴻鵠致遠(yuǎn)投資共同注資,標(biāo)志著地芯科技資本市場(chǎng)上的強(qiáng)勁勢(shì)頭和廣泛認(rèn)可。
    的頭像 發(fā)表于 08-01 17:15 ?775次閱讀

    一文了解MySQL索引機(jī)制

    的呢?一起靜下心來(lái),耐心看完這篇文章吧,干貨不啰嗦,相信你一定會(huì)有所收獲。 一、索引模型 模型也就是數(shù)據(jù)結(jié)構(gòu),常見(jiàn)的三種模型分別是哈希表、有序數(shù)組和搜索樹(shù)。 了解MySQL的朋友已經(jīng)知道,現(xiàn)在
    的頭像 發(fā)表于 07-25 14:05 ?341次閱讀
    一文了解<b class='flag-5'>MySQL</b><b class='flag-5'>索引</b>機(jī)制

    MySQL的整體邏輯架構(gòu)

    支持多種存儲(chǔ)引擎是眾所周知的MySQL特性,也是MySQL架構(gòu)的關(guān)鍵優(yōu)勢(shì)之一。如果能夠理解MySQL Server與存儲(chǔ)引擎之間是怎樣通過(guò)API交互的,將大大有利于理解MySQL的核心
    的頭像 發(fā)表于 04-30 11:14 ?495次閱讀
    <b class='flag-5'>MySQL</b>的整體邏輯架構(gòu)

    步進(jìn)電機(jī)A+ A-有波形輸出,B+ B-沒(méi)有波形是什么原因?

    ,B+B-沒(méi)有,會(huì)是什么原因。 A+ ---》AOUT1 A- ---》AOUT2 B+ ---》BOUT1 B- ---》BOUT1
    發(fā)表于 04-18 07:30
    幸运水果机小游戏| 总格24名人| 宾利百家乐官网游戏| 大发888下载地址| 百家乐透视牌靴价格| 百家乐官网推二八杠| 新澳博天上人间娱乐| 大发888下载 df888| 玩百家乐输了| 路冲铺面能做生意吗| 百家乐官网l23| 阿拉善右旗| 德州扑克 单机版| 百家乐手机壳| 真人百家乐开户优惠| 六十甲子24山吉凶| 百家乐官网单人操作扫描道具| 博彩娱乐场| 德州扑克发牌员| 太阳城莱迪广场| 678百家乐博彩娱乐场开户注册| 百家乐娱乐城反水| 百家乐官网套利| 百家乐官网贴| 房产| 博彩网导航| 申城棋牌2.0| 二八杠单机游戏| 百家乐现金网最好的系统哪里有可靠吗| 澳门百家乐怎赌才能赚钱| 百家乐注码方法| 百家乐官网免| 网络百家乐官网电脑| 揭秘百家乐官网百分之50| 澳门百家乐官网有限公司| 大英县| 保时捷娱乐| 88娱乐城开户| 顶级赌场连环夺宝下载 | 网上百家乐内幕| 棋牌百家乐怎么玩|