MySQL底層數據結構詳解

一、B+樹索引

1、B+樹是一種平衡樹,它是一種多路查找樹,每個節點可以存儲多個索引值和相應數據的地址。MySQL使用B+樹作為索引結構,B+樹的優勢在於磁盤I/O瓶頸的優化,它的每個非葉子節點都存儲有下一層葉子節點的地址,可以按照層級進行I/O優化。

2、B+樹在MySQL中的實現採用了InnoDB存儲引擎,它的B+樹索引結構中,在非葉子節點存儲的是索引值,數據都記錄在葉子節點,可以通過葉子節點的鏈表進行順序掃描查詢。葉子節點的數據存儲按照主鍵的順序存儲,所以在進行範圍查詢時,可以通過順序掃描最小值和最大值之間的葉子節點進行查詢。

示例代碼:

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `age` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `age` (`age`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

二、聚簇索引

1、聚簇索引是一種特殊的索引,它與數據行存儲在一起,即索引和數據在同一個物理區域內存儲。從而在使用聚簇索引進行主鍵查詢時,可以減少I/O的次數,提高查詢效率,並且避免了非聚簇索引的回表操作。

2、在MySQL中,InnoDB存儲引擎默認採用的就是聚簇索引,所以在進行主鍵查詢時,可以通過B+樹索引直接定位到數據行所在的物理地址,從而避免了回表操作。

示例代碼:

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `age` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `age` (`age`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

三、自適應哈希索引

1、自適應哈希索引是一種動態調整的索引結構,它可以根據數據的讀取頻率自動調整哈希索引表的大小,並且可以根據數據的訪問情況進行動態的哈希函數調整。在數據分佈不均勻的情況下,自適應哈希索引比B+樹索引具有更好的查詢性能。

2、在MySQL中,自適應哈希索引被用於InnoDB存儲引擎中,用於加速緩存中的數據查詢。它在緩存中可以替代B+樹索引的一部分功能,從而減少B+樹的節點數,提高查詢效率。

示例代碼:

ALTER TABLE `users` ADD PRIMARY KEY USING HASH (id);

四、頁式存儲結構

1、頁式存儲結構是指MySQL的數據存儲結構是按照頁為單位進行管理,每個頁的大小是固定的。在InnoDB存儲引擎中,每個頁的大小默認為16KB,而MyISAM存儲引擎中每個頁的大小默認為1KB。

2、MySQL在存儲記錄時,使用了基於B+樹的頁式存儲結構,通過將數據按照頁的大小劃分成多個塊,分別存儲在不同的頁內,從而提高數據存儲和查詢的效率。同時,MySQL在管理頁的使用中也採用了緩存機制,常用的頁會被緩存到內存中,從而減少I/O次數。

示例代碼:

ALTER TABLE `users` ENGINE=InnoDB;

五、undo日誌和redo日誌

1、undo日誌是在事務執行過程中記錄數據修改前的狀態的日誌文件,在事務回滾時可以用來還原修改前的狀態,以保證數據的一致性。

2、redo日誌是記錄數據修改後的狀態的日誌文件,在MySQL的InnoDB存儲引擎中,redo日誌的作用是在崩潰恢復或者主從複製的過程中,恢複數據的一致性。

示例代碼:

1、開啟undo日誌

SET GLOBAL innodb_undo_logs=4;
SET GLOBAL innodb_undo_tablespaces=2;

2、開啟redo日誌

SET GLOBAL innodb_flush_log_at_trx_commit=1;
SET GLOBAL innodb_file_per_table=1;

原創文章,作者:PZCZP,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/370164.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
PZCZP的頭像PZCZP
上一篇 2025-04-18 13:40
下一篇 2025-04-18 13:40

相關推薦

  • 如何修改mysql的端口號

    本文將介紹如何修改mysql的端口號,方便開發者根據實際需求配置對應端口號。 一、為什麼需要修改mysql端口號 默認情況下,mysql使用的端口號是3306。在某些情況下,我們需…

    編程 2025-04-29
  • 數據結構與算法基礎青島大學PPT解析

    本文將從多個方面對數據結構與算法基礎青島大學PPT進行詳細的闡述,包括數據類型、集合類型、排序算法、字符串匹配和動態規劃等內容。通過對這些內容的解析,讀者可以更好地了解數據結構與算…

    編程 2025-04-29
  • Python操作MySQL

    本文將從以下幾個方面對Python操作MySQL進行詳細闡述: 一、連接MySQL數據庫 在使用Python操作MySQL之前,我們需要先連接MySQL數據庫。在Python中,我…

    編程 2025-04-29
  • 數據結構學生成績管理系統

    在現代教育中,學生成績的管理已經成為了一個不可或缺的部分。藉助數據結構,一個高效、可靠的學生成績管理系統可以被輕鬆實現。 一、數據結構的選擇 在構建學生成績管理系統時,選擇合適的數…

    編程 2025-04-29
  • MySQL遞歸函數的用法

    本文將從多個方面對MySQL遞歸函數的用法做詳細的闡述,包括函數的定義、使用方法、示例及注意事項。 一、遞歸函數的定義 遞歸函數是指在函數內部調用自身的函數。MySQL提供了CRE…

    編程 2025-04-29
  • MySQL bigint與long的區別

    本文將從數據類型定義、存儲空間、數據範圍、計算效率、應用場景五個方面詳細闡述MySQL bigint與long的區別。 一、數據類型定義 bigint在MySQL中是一種有符號的整…

    編程 2025-04-28
  • MySQL左連接索引不生效問題解決

    在MySQL數據庫中,經常會使用左連接查詢操作,但是左連接查詢中索引不生效的情況也比較常見。本文將從多個方面探討MySQL左連接索引不生效問題,並給出相應的解決方法。 一、索引的作…

    編程 2025-04-28
  • CentOS 7在線安裝MySQL 8

    在本文中,我們將介紹如何在CentOS 7操作系統中在線安裝MySQL 8。我們會從安裝環境的準備開始,到安裝MySQL 8的過程進行詳細的闡述。 一、環境準備 在進行MySQL …

    編程 2025-04-27
  • 如何使用MySQL字段去重

    本文將從多個方面為您詳細介紹如何使用MySQL字段去重並給出相應的代碼示例。 一、SELECT DISTINCT語句去重 MySQL提供了SELECT DISTINCT語句,通過在…

    編程 2025-04-27
  • MySQL正則表達式替換

    MySQL正則表達式替換是指通過正則表達式對MySQL中的字符串進行替換。在文本處理方面,正則表達式是一種強大的工具,可以方便快捷地進行字符串處理和匹配。在MySQL中,可以使用正…

    編程 2025-04-27

發表回復

登錄後才能評論