最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL數(shù)據(jù)庫(kù)索引及底層數(shù)據(jù)結(jié)構(gòu)詳解

 更新時(shí)間:2025年08月09日 09:11:16   作者:驚駭世俗王某人  
MySQL默認(rèn)使用B+樹(shù)索引和InnoDB引擎,索引通過(guò)有序結(jié)構(gòu)加速數(shù)據(jù)檢索,但增加存儲(chǔ)與維護(hù)成本,B+樹(shù)優(yōu)化了磁盤(pán)讀寫(xiě)與范圍查詢效率,成為主流選擇,本文介紹MySQL數(shù)據(jù)庫(kù)索引及底層數(shù)據(jù)結(jié)構(gòu)的相關(guān)知識(shí),感興趣的朋友一起看看吧

MySQL默認(rèn)使用的索引底層數(shù)據(jù)結(jié)構(gòu)是B+樹(shù),默認(rèn)存儲(chǔ)引擎是InnoDB引擎。

這是MySQL文檔,有需要的自己瀏覽。

https://dev.mysql.com/doc/refman/8.0/en/

接下來(lái)我們步入今天的正題:

1. 什么是索引

  • 索引(index)是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)(有序)??梢钥焖俣ㄎ粩?shù)據(jù)位置而不必掃描整個(gè)表。
  • 在數(shù)據(jù)之外,數(shù)據(jù)庫(kù)系統(tǒng)還維護(hù)著滿足特定査找算法的數(shù)據(jù)結(jié)構(gòu)(B+樹(shù)),這些數(shù)據(jù)結(jié)構(gòu)以某種方式引用(指向)數(shù)據(jù),這樣就可以在這些數(shù)據(jù)結(jié)構(gòu)上實(shí)現(xiàn)高級(jí)查找算法這種數(shù)據(jù)結(jié)構(gòu)就是索引。

索引的優(yōu)缺點(diǎn):

優(yōu)點(diǎn)

  • 提高查詢速度:索引可以大大加快數(shù)據(jù)檢索速度,特別是對(duì)于大型表
  • 加速排序和分組操作:ORDER BY和GROUP BY操作在有索引時(shí)會(huì)更快
  • 優(yōu)化連接操作:表連接時(shí)如果有適當(dāng)?shù)乃饕龝?huì)顯著提高性能
  • 保證數(shù)據(jù)唯一性:唯一索引可以確保列中數(shù)據(jù)的唯一性
  • 減少服務(wù)器掃描的數(shù)據(jù)量:MySQL可以使用索引直接定位到所需數(shù)據(jù),而不必掃描整個(gè)表

缺點(diǎn)

  • 占用額外存儲(chǔ)空間:索引需要額外的磁盤(pán)空間
  • 降低寫(xiě)入性能
    • INSERT操作需要同時(shí)更新索引
    • UPDATE操作如果修改了索引列需要更新索引
    • DELETE操作也需要更新索引
  • 維護(hù)成本:索引需要定期維護(hù),特別是在數(shù)據(jù)頻繁變更的情況下
  • 優(yōu)化器可能不使用索引:在某些情況下,MySQL優(yōu)化器可能決定不使用索引
  • 索引選擇過(guò)多可能導(dǎo)致性能下降:過(guò)多的索引會(huì)增加優(yōu)化器選擇執(zhí)行計(jì)劃的時(shí)間

索引的數(shù)據(jù)類型:

MySQL支持多種索引類型,每種類型適用于不同的場(chǎng)景和需求。

1. 普通索引 (INDEX / KEY)

  • 最基本的索引類型,沒(méi)有特殊限制
  • 語(yǔ)法:CREATE INDEX index_name ON table_name(column_name)
  • 適用于大多數(shù)查詢場(chǎng)景

2. 唯一索引 (UNIQUE INDEX)

  • 確保索引列的值唯一,但允許NULL值
  • 語(yǔ)法:CREATE UNIQUE INDEX index_name ON table_name(column_name)
  • 常用于主鍵或需要唯一約束的列

3. 主鍵索引 (PRIMARY KEY)

  • 特殊的唯一索引,不允許NULL值
  • 每個(gè)表只能有一個(gè)主鍵
  • 語(yǔ)法:ALTER TABLE table_name ADD PRIMARY KEY (column_name)

4. 全文索引 (FULLTEXT INDEX)

  • 專門(mén)用于全文搜索,僅適用于MyISAM和InnoDB(MySQL 5.6+)引擎
  • 語(yǔ)法:CREATE FULLTEXT INDEX index_name ON table_name(column_name)
  • 支持MATCH AGAINST操作

5. 組合索引 (復(fù)合索引)

  • 在多個(gè)列上創(chuàng)建的索引
  • 語(yǔ)法:CREATE INDEX index_name ON table_name(col1, col2, col3)
  • 遵循最左前綴原則

6. 空間索引 (SPATIAL INDEX)

  • 用于地理空間數(shù)據(jù)類型(GEOMETRY, POINT, LINESTRING, POLYGON等)
  • 僅MyISAM表支持
  • 語(yǔ)法:CREATE SPATIAL INDEX index_name ON table_name(column_name)

7. 前綴索引

  • 對(duì)列值的前N個(gè)字符建立索引
  • 語(yǔ)法:CREATE INDEX index_name ON table_name(column_name(N))
  • 適用于長(zhǎng)字符串列

8. 哈希索引

  • Memory存儲(chǔ)引擎默認(rèn)使用哈希索引
  • InnoDB有自適應(yīng)哈希索引功能(自動(dòng)管理)
  • 僅支持等值查詢(=, IN),不支持范圍查詢

9. 覆蓋索引

  • 不是一種單獨(dú)的索引類型,而是一種使用方式
  • 當(dāng)查詢的所有列都包含在索引中時(shí),MySQL可以直接從索引獲取數(shù)據(jù)而無(wú)需回表

注意一點(diǎn):聚簇索引(Clustered Index)和非聚簇索引(Non-clustered Index)雖然也稱之為索引,但和這些分類有很大的區(qū)別。

核心原因還是因?yàn)椋?u>分類維度不同

  • MySQL官方按功能分類(開(kāi)發(fā)者視角)
    • 這些主鍵索引、唯一索引、普通索引、全文索引等,主要關(guān)注索引的邏輯功能約束條件
  • 聚簇/非聚簇是存儲(chǔ)實(shí)現(xiàn)分類(引擎內(nèi)部視角)
    • 描述數(shù)據(jù)與索引的物理存儲(chǔ)關(guān)系,屬于底層實(shí)現(xiàn)機(jī)制而非用戶可配置選項(xiàng)。

未單獨(dú)列為類型的其他原因:

  • 引擎相關(guān)性
    • 是否聚簇取決于存儲(chǔ)引擎實(shí)現(xiàn),比如:InnoDB有聚簇索引,MyISAM則沒(méi)有。
  • 用戶不可選擇性
    • 開(kāi)發(fā)者不能直接選擇創(chuàng)建聚簇/非聚簇索引,而是由主鍵定義和引擎特性自動(dòng)決定。
  • 透明性考慮
    • 對(duì)大多數(shù)應(yīng)用開(kāi)發(fā)是底層實(shí)現(xiàn)細(xì)節(jié),功能分類對(duì)開(kāi)發(fā)者更實(shí)用。
  • 歷史兼容性
    • 不同引擎行為差異大,統(tǒng)一分類會(huì)引發(fā)混淆。

2. 索引的底層數(shù)據(jù)結(jié)構(gòu)

MySQL索引使用多種數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn),不同的存儲(chǔ)引擎采用不同的索引結(jié)構(gòu)來(lái)優(yōu)化查詢性能。

常用的數(shù)據(jù)結(jié)構(gòu)有:

  • B樹(shù)(B-Tree)
  • B+樹(shù)(B+Tree)(InnoDB實(shí)際采用)
  • Hash
  • R-Tree(空間索引)

MySQL主要就是使用B+樹(shù)。

在了解B樹(shù)和B+樹(shù)之前,我們先來(lái)了解一下二叉樹(shù):

二叉樹(shù)(二叉搜索樹(shù))

  • 二叉搜索樹(shù)(Binary Search Tree, BST)是一種特殊的二叉樹(shù):
    • 左子樹(shù)所有節(jié)點(diǎn)值 < 根節(jié)點(diǎn)值
    • 右子樹(shù)所有節(jié)點(diǎn)值 > 根節(jié)點(diǎn)值
    • 左右子樹(shù)也分別是BST

優(yōu)點(diǎn):

  1. 邏輯簡(jiǎn)單:易于理解和實(shí)現(xiàn)
  2. 有序性:中序遍歷可得有序序列
  3. 二分查找:理想情況下查詢效率高

缺點(diǎn):

  • 不平衡風(fēng)險(xiǎn):可能退化成鏈表(復(fù)雜度→O(n))
  • 不適合磁盤(pán)存儲(chǔ):節(jié)點(diǎn)隨機(jī)分布導(dǎo)致大量磁盤(pán)I/O

下面就是最壞情況下的二叉樹(shù),直接演化為了一個(gè)鏈表形式。

B樹(shù)(B-Tree)

B-Tree,B樹(shù)是一種自平衡的樹(shù)數(shù)據(jù)結(jié)構(gòu),相對(duì)于二叉樹(shù),B樹(shù)每個(gè)節(jié)點(diǎn)可以有多個(gè)分支,即多叉。它保持?jǐn)?shù)據(jù)有序,并允許進(jìn)行高效的搜索、順序訪問(wèn)、插入和刪除操作。

以一顆最大度數(shù)(max-degree)為5(5階)的b-tree為例,那這個(gè)B樹(shù)每個(gè)節(jié)點(diǎn)最多存儲(chǔ)4個(gè)key

B樹(shù)的主要特性:

  • 多路平衡搜索樹(shù):每個(gè)節(jié)點(diǎn)可以有多個(gè)子節(jié)點(diǎn)。
  • 自平衡:樹(shù)始終保持平衡狀態(tài)。
  • 有序存儲(chǔ):節(jié)點(diǎn)中的鍵(key)按順序排列。
  • 適合外存:設(shè)計(jì)用于減少磁盤(pán)訪問(wèn)次數(shù)。

B+樹(shù)(B+Tree)

B+Tree是在BTree基礎(chǔ)上的一種優(yōu)化,具有比B樹(shù)更適合外部存儲(chǔ)的特性,InnoDB存儲(chǔ)引擎就是用B+Tree實(shí)現(xiàn)其索引結(jié)構(gòu)。

B+樹(shù)的主要特點(diǎn):

  • 多路平衡:每個(gè)節(jié)點(diǎn)可以有多個(gè)子節(jié)點(diǎn),保持樹(shù)的平衡
  • 分層存儲(chǔ)數(shù)據(jù)只存儲(chǔ)在葉子節(jié)點(diǎn),內(nèi)部節(jié)點(diǎn)只存儲(chǔ)鍵值(索引)
  • 順序訪問(wèn):所有葉子節(jié)點(diǎn)通過(guò)指針連接成一個(gè)有序鏈表

B+樹(shù)與B樹(shù)的比較

特性B樹(shù)B+樹(shù)
數(shù)據(jù)存儲(chǔ)所有節(jié)點(diǎn)都可存儲(chǔ)數(shù)據(jù)僅葉子節(jié)點(diǎn)存儲(chǔ)數(shù)據(jù)
查找性能可能提前終止(非葉子節(jié)點(diǎn)找到)必須到達(dá)葉子節(jié)點(diǎn)
范圍查詢需要中序遍歷通過(guò)葉子鏈表高效掃描
空間利用率內(nèi)部節(jié)點(diǎn)存儲(chǔ)數(shù)據(jù)占用更多空間內(nèi)部節(jié)點(diǎn)更緊湊
穩(wěn)定性查詢路徑長(zhǎng)度不一致所有查詢路徑長(zhǎng)度相同
實(shí)現(xiàn)復(fù)雜度相對(duì)簡(jiǎn)單相對(duì)復(fù)雜(需維護(hù)葉子鏈表)

總的來(lái)說(shuō),由于B+樹(shù)獨(dú)特的數(shù)據(jù)存儲(chǔ)方式:

  • B+樹(shù)的磁盤(pán)讀寫(xiě)代價(jià)更低。
  • B+樹(shù)的查詢效率更加穩(wěn)定。
  • B+樹(shù)更便于掃庫(kù)和區(qū)間查詢。

3.總結(jié)

3.1 什么是索引?

  • 索引(index)是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)(有序)。
  • 提高數(shù)據(jù)檢索的效率,降低數(shù)據(jù)庫(kù)的IO成本(不需要全表掃描)。
  • 通過(guò)索引列對(duì)數(shù)據(jù)進(jìn)行排序,降低數(shù)據(jù)排序的成本,降低了CPU的消耗。

3.2 索引的底層數(shù)據(jù)結(jié)構(gòu)?

MySQL的InnoDB引擎采用的B+樹(shù)的數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)索引

  • 階數(shù)更多,路徑更短。
  • 磁盤(pán)讀寫(xiě)代價(jià)B+樹(shù)更低,非葉子節(jié)點(diǎn)只存儲(chǔ)指針,葉子階段存儲(chǔ)數(shù)據(jù)。
  • B+樹(shù)便于掃庫(kù)和區(qū)間查詢,葉子節(jié)點(diǎn)是一個(gè)雙向鏈表。

3.3 為什么 B+Tree 是主流?

  • 磁盤(pán)友好:減少 I/O 次數(shù)(矮胖的樹(shù)形結(jié)構(gòu))。
  • 范圍查詢高效:葉子節(jié)點(diǎn)鏈表避免回溯。
  • 緩存利用率高:非葉子節(jié)點(diǎn)僅存鍵值,可緩存更多索引。

到此這篇關(guān)于MySQL數(shù)據(jù)庫(kù)索引及底層數(shù)據(jù)結(jié)構(gòu)詳解的文章就介紹到這了,更多相關(guān)mysql索引底層數(shù)據(jù)結(jié)構(gòu)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • php mysql連接數(shù)據(jù)庫(kù)實(shí)例

    php mysql連接數(shù)據(jù)庫(kù)實(shí)例

    這篇文章主要介紹了php mysql連接數(shù)據(jù)庫(kù)實(shí)例,需要的朋友可以參考下
    2016-09-09
  • sqlite遷移到mysql腳本的方法

    sqlite遷移到mysql腳本的方法

    這篇文章主要介紹了sqlite遷移到mysql腳本的方法,需要的朋友可以參考下
    2017-08-08
  • mac下安裝mysql忘記密碼的修改方法

    mac下安裝mysql忘記密碼的修改方法

    這篇文章主要介紹了mac下安裝mysql忘記密碼的修改方法,需要的朋友可以參考下
    2017-06-06
  • mysql中InnoDB事務(wù)隔離的記錄鎖、間隙鎖和臨鍵鎖

    mysql中InnoDB事務(wù)隔離的記錄鎖、間隙鎖和臨鍵鎖

    mysql中InnoDB默認(rèn)的事務(wù)隔離級(jí)別為可重復(fù)讀(Repeated Read, RR),我們當(dāng)下的所有介紹都是基于這個(gè)隔離級(jí)別為前提的,記錄鎖鎖定索引關(guān)聯(lián)的具體記錄,間隙鎖鎖定間隔,防止間隔中被其他事務(wù)插入,臨鍵鎖鎖定索引記錄+間隔,防止幻讀
    2023-12-12
  • MySQL 統(tǒng)計(jì)查詢實(shí)現(xiàn)代碼

    MySQL 統(tǒng)計(jì)查詢實(shí)現(xiàn)代碼

    MySQL 統(tǒng)計(jì)查詢其實(shí)就是通過(guò)SELECT COUNT() FROM 語(yǔ)法用于從數(shù)據(jù)表中統(tǒng)計(jì)數(shù)據(jù)行數(shù)
    2014-05-05
  • MySQL 查詢速度慢的原因

    MySQL 查詢速度慢的原因

    高性能MySQL需要合理的設(shè)計(jì)查詢。如果查詢寫(xiě)的很糟糕,即使表結(jié)構(gòu)再合理、索引再合適,也是無(wú)法實(shí)現(xiàn)高性能的。
    2021-05-05
  • MySQL查詢重復(fù)記錄和刪除重復(fù)記錄的操作方法

    MySQL查詢重復(fù)記錄和刪除重復(fù)記錄的操作方法

    在MySQL數(shù)據(jù)庫(kù)中,有時(shí)候會(huì)出現(xiàn)重復(fù)記錄的情況,這可能會(huì)導(dǎo)致數(shù)據(jù)不準(zhǔn)確或者不符合業(yè)務(wù)需求,為了解決這個(gè)問(wèn)題,我們可以使用查詢語(yǔ)句來(lái)找出重復(fù)記錄,并使用刪除語(yǔ)句來(lái)刪除這些重復(fù)記錄,本文給大家介紹了兩種操作方法,需要的朋友可以參考下
    2024-12-12
  • MySQL中幾種插入和批量語(yǔ)句實(shí)例詳解

    MySQL中幾種插入和批量語(yǔ)句實(shí)例詳解

    這篇文章主要給大家介紹了關(guān)于MySQL中幾種插入和批量語(yǔ)句的相關(guān)資料,在mysql數(shù)據(jù)庫(kù)中,實(shí)現(xiàn)批量插入數(shù)據(jù)與批量更新數(shù)據(jù)的例子,即批量insert、update的方法,需要的朋友可以參考下
    2021-09-09
  • MySQL使用explain命令查看與分析索引的使用情況

    MySQL使用explain命令查看與分析索引的使用情況

    這篇文章主要介紹了MySQL使用explain命令查看與分析索引的使用情況,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • MySQL的主鍵命名策略相關(guān)

    MySQL的主鍵命名策略相關(guān)

    這篇文章主要介紹了MySQL的主鍵命名策略的的相關(guān)資料,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下
    2021-01-01

最新評(píng)論

奎屯市| 云阳县| 铅山县| 和平区| 霍邱县| 浙江省| 长治县| 霞浦县| 禄丰县| 平顶山市| 桃园县| 大余县| 新余市| 白河县| 阿图什市| 大荔县| 仙居县| 迁西县| 凯里市| 万山特区| 东明县| 茂名市| 余江县| 托里县| 桃园县| 杂多县| 兰溪市| 宜昌市| 玉环县| 乌鲁木齐县| 乌兰浩特市| 和林格尔县| 苏尼特右旗| 高平市| 清丰县| 天台县| 崇信县| 得荣县| 麻阳| 江油市| 济南市|