国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

MySQL為什么選擇B+樹(shù)創(chuàng)建索引

這篇具有很好參考價(jià)值的文章主要介紹了MySQL為什么選擇B+樹(shù)創(chuàng)建索引。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1. 全表遍歷

  • 將磁盤(pán)中存儲(chǔ)的所有數(shù)據(jù)記錄依次加載,與給定條件對(duì)比,直到找到目標(biāo)記錄;
  • 類(lèi)比數(shù)組結(jié)構(gòu)的線(xiàn)性查找,效率較低;

2. 哈希結(jié)構(gòu)

  • 結(jié)合數(shù)組和鏈表結(jié)構(gòu)(或者樹(shù)結(jié)構(gòu))存儲(chǔ)數(shù)據(jù);
  • 通過(guò)哈希函數(shù)(散列函數(shù))計(jì)算哈希地址,相同輸入在固定函數(shù)下輸出保持不變;
  • 哈希結(jié)構(gòu)會(huì)發(fā)生哈希沖突,使用哈希桶或者紅黑樹(shù)可緩解哈希沖突;
  • 哈希結(jié)構(gòu)查找效率較高,為O(1);
  • InnoDB和MyISAM存儲(chǔ)引擎均不支持哈希索引,而Memory存儲(chǔ)引擎支持哈希索引;

2.1 使用哈希結(jié)構(gòu)創(chuàng)建索引的缺點(diǎn)

  • 哈希索引可滿(mǎn)足等值查詢(xún)(==、!=、IN),對(duì)于范圍查詢(xún),效率較低;
  • 哈希索引下數(shù)據(jù)存儲(chǔ)無(wú)序,對(duì)于排序查詢(xún)效率較低;
  • 對(duì)于聯(lián)合索引,哈希索引將多個(gè)列結(jié)合進(jìn)行哈希計(jì)算,因此對(duì)于單獨(dú)的列無(wú)法進(jìn)行查詢(xún);
  • 哈希索引容易發(fā)生哈希沖突,此時(shí)查找效率降低;

2.2 哈希索引的適用性

  • InnoDB存儲(chǔ)引擎不支持哈希索引,但提供了自適應(yīng)哈希索引(Adaptive Hash Index)提高數(shù)據(jù)檢索效率;
  • 可通過(guò)show variables like '%adaptive_hash_index';查看MySQL是否開(kāi)啟了自適應(yīng)哈希索引;
  • 自適應(yīng)哈希索引(Adaptive Hash Index):如果某個(gè)數(shù)據(jù)頁(yè)被頻繁訪(fǎng)問(wèn),則當(dāng)滿(mǎn)足一定條件時(shí)將該數(shù)據(jù)頁(yè)對(duì)應(yīng)地址存儲(chǔ)在哈希表中,如此下次訪(fǎng)問(wèn)該數(shù)據(jù)頁(yè)時(shí)可直接由哈希表中的地址獲取,而不用在B+樹(shù)中檢索;
    MySQL為什么選擇B+樹(shù)創(chuàng)建索引,MySql,Java開(kāi)發(fā),mysql,b樹(shù),數(shù)據(jù)庫(kù),數(shù)據(jù)結(jié)構(gòu),java

3. 二叉搜索樹(shù)

  • 本質(zhì)是二叉樹(shù);
  • 限制條件:左<根<右,即任意一顆子樹(shù),其根節(jié)點(diǎn)的值大于左子樹(shù)所有節(jié)點(diǎn)的值,同時(shí)小于右子樹(shù)所有節(jié)點(diǎn)的值;
  • 二叉搜索樹(shù)一般查找效率較高,時(shí)間復(fù)雜度為O(log2n);

MySQL為什么選擇B+樹(shù)創(chuàng)建索引,MySql,Java開(kāi)發(fā),mysql,b樹(shù),數(shù)據(jù)庫(kù),數(shù)據(jù)結(jié)構(gòu),java

  • 缺點(diǎn):極端情況下會(huì)退化為單鏈表,查找效率降低;
    MySQL為什么選擇B+樹(shù)創(chuàng)建索引,MySql,Java開(kāi)發(fā),mysql,b樹(shù),數(shù)據(jù)庫(kù),數(shù)據(jù)結(jié)構(gòu),java

4. AVL樹(shù)

  • AVL樹(shù)即平衡二叉搜索樹(shù);
  • 限制條件:二叉搜索樹(shù)的任意子樹(shù)的左右子樹(shù)高度差絕對(duì)值不能超過(guò)1;
  • 優(yōu)點(diǎn):解決了二叉搜索樹(shù)退化為單鏈表的問(wèn)題;
  • 缺點(diǎn):雖然二叉樹(shù)實(shí)現(xiàn)簡(jiǎn)單,但如果數(shù)據(jù)量巨大,會(huì)導(dǎo)致二叉樹(shù)高度過(guò)大,查找效率降低;
    MySQL為什么選擇B+樹(shù)創(chuàng)建索引,MySql,Java開(kāi)發(fā),mysql,b樹(shù),數(shù)據(jù)庫(kù),數(shù)據(jù)結(jié)構(gòu),java

5. B樹(shù)

  • 本質(zhì)是多叉平衡搜索樹(shù),可解決AVL樹(shù)高度過(guò)高的問(wèn)題,提高查找效率;
    MySQL為什么選擇B+樹(shù)創(chuàng)建索引,MySql,Java開(kāi)發(fā),mysql,b樹(shù),數(shù)據(jù)庫(kù),數(shù)據(jù)結(jié)構(gòu),java

6. B+樹(shù)

  • 本質(zhì)是多叉平衡搜索樹(shù),基于B樹(shù)做了一定改進(jìn),更適合于文件索引系統(tǒng);
  • B+樹(shù)非葉節(jié)點(diǎn)中不存儲(chǔ)真實(shí)數(shù)據(jù),只存儲(chǔ)索引;
    MySQL為什么選擇B+樹(shù)創(chuàng)建索引,MySql,Java開(kāi)發(fā),mysql,b樹(shù),數(shù)據(jù)庫(kù),數(shù)據(jù)結(jié)構(gòu),java

6.1 B+ 樹(shù)和 B 樹(shù)的差異

  • 有 k 個(gè)孩子的節(jié)點(diǎn)就有 k 個(gè)關(guān)鍵字。也就是孩子數(shù)量 = 關(guān)鍵字?jǐn)?shù),而 B 樹(shù)中,孩子數(shù)量 = 關(guān)鍵字?jǐn)?shù)
    +1;
  • 非葉子節(jié)點(diǎn)的關(guān)鍵字也會(huì)同時(shí)存在在子節(jié)點(diǎn)中,并且是在子節(jié)點(diǎn)中所有關(guān)鍵字的最大(或最小);
  • 非葉子節(jié)點(diǎn)僅用于索引,不保存數(shù)據(jù)記錄,跟記錄有關(guān)的信息都放在葉子節(jié)點(diǎn)中。而 B 樹(shù)中, 非
    葉子節(jié)點(diǎn)既保存索引,也保存數(shù)據(jù)記錄;
  • 所有關(guān)鍵字都在葉子節(jié)點(diǎn)出現(xiàn),葉子節(jié)點(diǎn)構(gòu)成一個(gè)有序鏈表,而且葉子節(jié)點(diǎn)本身按照關(guān)鍵字的大小從小到大順序鏈接;

6.2 采用B+樹(shù)創(chuàng)建索引的優(yōu)勢(shì)

  • B+樹(shù)的內(nèi)節(jié)點(diǎn)不存儲(chǔ)真實(shí)數(shù)據(jù)記錄,而B(niǎo)樹(shù)內(nèi)節(jié)點(diǎn)會(huì)存儲(chǔ)部分真實(shí)數(shù)據(jù);
  • B+樹(shù)查詢(xún)效率更加穩(wěn)定;
  • B+樹(shù)高度更低,查詢(xún)效率更高;
  • 對(duì)于范圍查詢(xún),B+樹(shù)只有葉子結(jié)點(diǎn)存儲(chǔ)有序的真實(shí)數(shù)據(jù),因此查詢(xún)效率更高;

6.3 一些需要注意的問(wèn)題

1)為了減少I(mǎi)O,索引樹(shù)會(huì)一次性加載嗎?

  • 如果數(shù)據(jù)表存儲(chǔ)的數(shù)據(jù)量非常大,則對(duì)應(yīng)的索引文件可能也會(huì)很大,如果一次性加載到內(nèi)存,對(duì)于內(nèi)存要求較高;
  • 實(shí)際情況下,對(duì)于索引文件的加載是逐一進(jìn)行的;

2)B+樹(shù)的存儲(chǔ)能力如何?為何說(shuō)一般查找行記錄,最多只需1~3次磁盤(pán)IO?

  • B+樹(shù)為多叉平衡搜索樹(shù),每個(gè)節(jié)點(diǎn)對(duì)應(yīng)一個(gè)真實(shí)數(shù)據(jù)頁(yè),每個(gè)數(shù)據(jù)頁(yè)默認(rèn)大小為16KB;
  • 主鍵類(lèi)型一般采用INT(4B)或BIGINT(8B),指針類(lèi)型一般也占據(jù)4B或8B ,最大情況下一個(gè)數(shù)據(jù)頁(yè)可以存儲(chǔ)16KB/(8B+8B)≈1000條記錄;
  • 對(duì)于目錄項(xiàng)記錄頁(yè),每個(gè)數(shù)據(jù)頁(yè)假設(shè)可存儲(chǔ)1000條記錄,則當(dāng)B+樹(shù)高度為3時(shí),可存儲(chǔ)約109條記錄,數(shù)據(jù)量非常龐大;
  • 實(shí)際情況中,B+樹(shù)上面三層可能不會(huì)完全填充,因此實(shí)際B+樹(shù)一般設(shè)計(jì)為2~4層,也就是磁盤(pán)I/O次數(shù)為2~4次。但I(xiàn)nnoDB存儲(chǔ)引擎設(shè)計(jì)時(shí)將根節(jié)點(diǎn)常駐在內(nèi)存,所以實(shí)際磁盤(pán)I/O次數(shù)為1~3次;

3)為什么說(shuō)B+樹(shù)比B-樹(shù)更適合實(shí)際應(yīng)用中操作系統(tǒng)的文件索引和數(shù)據(jù)庫(kù)索引?

B+樹(shù)只有葉子結(jié)點(diǎn)存儲(chǔ)真實(shí)數(shù)據(jù),查詢(xún)效率更高更穩(wěn)定,磁盤(pán)占用更少;

4)Hash 索引與 B+ 樹(shù)索引的區(qū)別?

  • InnoDB存儲(chǔ)引擎不支持Hash索引;
  • Hash索引數(shù)據(jù)存儲(chǔ)無(wú)序,不支持ORDER BY排序,也不支持模糊查詢(xún);
  • Hash索引數(shù)據(jù)存儲(chǔ)無(wú)序,不能進(jìn)行范圍查詢(xún);
  • Hash索引不支持聯(lián)合索引的最左側(cè)原則,即聯(lián)合索引的部分索引無(wú)法使用;

5)Hash 索引與 B+ 樹(shù)索引是在建索引的時(shí)候手動(dòng)指定的嗎?

  • InnoDB、MyISAM存儲(chǔ)引擎不支持Hash索引,對(duì)于InnoDB提供的自適應(yīng)哈希索引默認(rèn)開(kāi)啟,不需要手動(dòng)指定;
  • Memory存儲(chǔ)引擎默認(rèn)采用Hash索引;

參考《尚硅谷》文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-536530.html

到了這里,關(guān)于MySQL為什么選擇B+樹(shù)創(chuàng)建索引的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀(guān)點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • MySQL為什么要使用B+樹(shù)做索引?MySQL索引存儲(chǔ)模型推演,B+樹(shù)在MySQL的落地形式

    MySQL為什么要使用B+樹(shù)做索引?MySQL索引存儲(chǔ)模型推演,B+樹(shù)在MySQL的落地形式

    user_innodb這張表里有4個(gè)字段,id,name,gender,phone。 當(dāng)這張表有500萬(wàn)條數(shù)據(jù),在沒(méi)有索引的name字段上執(zhí)行一條where查詢(xún): 如果name字段上有索引呢?我們?cè)趎ame字段上面創(chuàng)建一個(gè)索引,再來(lái)執(zhí)行一下查詢(xún): 我們?cè)賮?lái)執(zhí)行一下select語(yǔ)句。 我們會(huì)發(fā)現(xiàn),有索引的查詢(xún)和沒(méi)有索引的

    2024年02月16日
    瀏覽(30)
  • MySQL為什么采用B+樹(shù)作為索引底層數(shù)據(jù)結(jié)構(gòu)?

    MySQL為什么采用B+樹(shù)作為索引底層數(shù)據(jù)結(jié)構(gòu)?

    ????????索引就像一本書(shū)的目錄,通過(guò)索引可以快速找到我們想要找的內(nèi)容。那么什么樣的數(shù)據(jù)結(jié)構(gòu)可以用來(lái)實(shí)現(xiàn)索引呢?我們可能會(huì)想到:二叉查找樹(shù),平衡搜索樹(shù),或者是B樹(shù)等等一系列的數(shù)據(jù)結(jié)構(gòu),那么為什么MySQL最終選擇了B+樹(shù)作為索引的數(shù)據(jù)結(jié)構(gòu)呢? ? ? ? ? 要想

    2024年02月16日
    瀏覽(25)
  • MySQL 索引為什么使用 B+ 樹(shù),而不使用紅黑樹(shù) / B 樹(shù) ?

    MySQL 索引為什么使用 B+ 樹(shù),而不使用紅黑樹(shù) / B 樹(shù) ?

    首先 B 樹(shù)和 B+ 樹(shù) 都是多叉搜索樹(shù),然后我們先來(lái)觀(guān)察一下 B+ 樹(shù)和 B 樹(shù)的數(shù)據(jù)結(jié)構(gòu): B+ 樹(shù)的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn) ?B 樹(shù)的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn) 【B+ 樹(shù)相較于 B 樹(shù)的優(yōu)勢(shì)】 1. IO 次數(shù)更少(查詢(xún)效率更高) ????????B+ 樹(shù)的非葉子節(jié)點(diǎn)不存放實(shí)際的數(shù)據(jù),僅存放索引,因此數(shù)據(jù)量相同的情況

    2024年02月12日
    瀏覽(25)
  • MSQL系列(十二) Mysql實(shí)戰(zhàn)-為什么索引要建立在被驅(qū)動(dòng)表上

    MSQL系列(十二) Mysql實(shí)戰(zhàn)-為什么索引要建立在被驅(qū)動(dòng)表上

    Mysql實(shí)戰(zhàn)-為什么索引要建立在被驅(qū)動(dòng)表上 前面我們講解了B+Tree的索引結(jié)構(gòu),也詳細(xì)講解下 left Join的底層驅(qū)動(dòng)表 選擇原理,那么今天我們來(lái)看看到底如何用以及如何建立索引和索引優(yōu)化 開(kāi)始之前我們先提一個(gè)問(wèn)題, 為什么索引要建立在被驅(qū)動(dòng)表上 ? 1.建表及測(cè)試數(shù)據(jù) 我們先

    2024年02月08日
    瀏覽(43)
  • android studio創(chuàng)建一個(gè)新的項(xiàng)目為什么默認(rèn)是kotlin語(yǔ)言而選擇不了java語(yǔ)言

    android studio創(chuàng)建一個(gè)新的項(xiàng)目為什么默認(rèn)是kotlin語(yǔ)言而選擇不了java語(yǔ)言

    關(guān)于android studio語(yǔ)言選擇的問(wèn)題。 我在進(jìn)入android studio為什么創(chuàng)建一個(gè)新項(xiàng)目之后選擇不了java語(yǔ)言有什么辦法可以解決。 解決辦法:這個(gè)模式下選著一個(gè)Empty Activity模塊就可以使用java語(yǔ)言。 這對(duì)于剛剛接觸anaroid studio新手比較管用。 ?

    2024年02月11日
    瀏覽(24)
  • 為什么我心中TOP1的編程語(yǔ)言是Java?我為什么選擇Java?
  • 為什么Java是物聯(lián)網(wǎng)的完美選擇

    為什么Java是物聯(lián)網(wǎng)的完美選擇

    在過(guò)去的十年中,我們見(jiàn)證了各種設(shè)備通過(guò)網(wǎng)絡(luò)連接在一起,各種傳感器、溫度計(jì)、交通、流速傳感器以及數(shù)據(jù)傳輸。大家都聽(tīng)說(shuō)過(guò)互聯(lián)網(wǎng),那有沒(méi)有聽(tīng)說(shuō)過(guò)物聯(lián)網(wǎng)呢?大家下面可以跟著袁老師的步伐探討物聯(lián)網(wǎng)相關(guān)的內(nèi)容。 我們都知道,Java語(yǔ)言在開(kāi)發(fā)上優(yōu)勢(shì)明顯,穩(wěn)定性

    2024年01月21日
    瀏覽(20)
  • Redis—Redis介紹(是什么/為什么快/為什么做MySQL緩存等)

    Redis—Redis介紹(是什么/為什么快/為什么做MySQL緩存等)

    一、Redis是什么 Redis 是一種 基于內(nèi)存的數(shù)據(jù)庫(kù) ,對(duì)數(shù)據(jù)的讀寫(xiě)操作都是在內(nèi)存中完成,因此讀寫(xiě)速度非???,常用于 緩存,消息隊(duì)列、分布式鎖等場(chǎng)景 。 ????????Redis 提供了多種數(shù)據(jù)類(lèi)型來(lái)支持不同的業(yè)務(wù)場(chǎng)景,比如 String(字符串)、Hash(哈希)、 List (列表)、Set(集合)、

    2024年02月10日
    瀏覽(29)
  • mysql為什么用b+樹(shù)

    目前的mysql索引使用b+樹(shù)結(jié)構(gòu), b+樹(shù)使用內(nèi)部節(jié)點(diǎn)存儲(chǔ)key和指針,葉子節(jié)點(diǎn)存儲(chǔ)數(shù)據(jù), 內(nèi)部節(jié)點(diǎn)沒(méi)有存儲(chǔ)具體data, 結(jié)構(gòu)變得矮胖 使得 io次數(shù)變少 , 性能提高 , 由于數(shù)據(jù)的查詢(xún)都是從根節(jié)點(diǎn)到葉子節(jié)點(diǎn)的查詢(xún)路徑, b+樹(shù)的查詢(xún)路徑相同, 查詢(xún)非常穩(wěn)定 B樹(shù)沒(méi)有內(nèi)部節(jié)點(diǎn)和葉子結(jié)點(diǎn)的區(qū)

    2024年02月08日
    瀏覽(20)
  • mysql插入數(shù)據(jù)會(huì)失???為什么?

    mysql插入數(shù)據(jù)會(huì)失?。繛槭裁??

    那天,我還在外面吃成都六姐的冒菜。 牛肉丸裹上麻醬后,狠狠嘬一口,都要入嘴了。 產(chǎn)品經(jīng)理突然發(fā)來(lái)消息。 \\\"線(xiàn)上有些用戶(hù)不能注冊(cè)了\\\" 心想著\\\"關(guān)我x事,又不是我做的模塊\\\",放下手機(jī)。 不對(duì),那老哥上禮拜剛離職了,想到這里,夾住毛肚的手 微微顫抖 。 對(duì)面繼續(xù)發(fā):

    2024年02月05日
    瀏覽(23)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包