MySQL 數據結構的詳細闡述

一、存儲引擎

MySQL 資料庫使用不同的存儲引擎來支持不同的需求,如性能、事務支持、並發性等。目前,MySQL 支持的存儲引擎有 MyISAM、InnoDB、Memory、CSV、Archive 等。下面介紹 MyISAM 存儲引擎的一些數據結構。

二、MyISAM

1. 數據文件

MyISAM 存儲引擎的數據文件由數據和索引兩部分組成。數據文件的命名規則為表名加上擴展名 .MYD,而索引文件的命名規則為表名加上擴展名 .MYI。

/*******************************************************************************
 MyISAM 數據文件格式
*******************************************************************************/
struct st_myisam_data_file_def
{
  uchar key_buff[MAX_KEY_LENGTH + 8];
  ulonglong records;
  uint    max_data_file_length;
  uint    data_file_length;
  uint    deleted_rows;
  uint    min_data_file_length;
  uint    auto_increment;
  uint    checksum;
  uchar   unused[3];
  uchar   concurrent;
  uchar   compressed;
};

2. 索引文件

MyISAM 的索引文件以 B+ 樹結構來保存索引,它將數據按鍵值大小排序。MySQL 採用的是定長記錄和變長記錄兩種索引方式。定長記錄的每一條記錄長度相等,變長記錄的每一條記錄長度都不相等。

/*******************************************************************************
 MyISAM 索引文件格式
*******************************************************************************/
struct st_myisam_index_def {
  uchar   unused1[8];
  ulonglong  key_length;
  uchar   keytype;
  uint   16 bit_key_parts;
  uint    key_parts;
  uchar   unused2[13];
  ulonglong  rec_per_key;
  ulonglong 16 start_key_file;
  ulonglong 16 end_key_file;
  uchar   unused3[4];
};

3. 數據緩衝區

MyISAM 存儲引擎通過緩存管理器(cache manager)來緩存數據和索引。數據緩衝區實現了哈希表來優化檢索速度。

/*******************************************************************************
 MyISAM 數據緩衝區格式
*******************************************************************************/
struct st_myisam_key_cache {
  KEY_CACHE hash[MAX_CACHE_BLOCKS];
  uchar   *data_memory;
  uchar   *key_memory;
  size_t   mem_root;
  size_t   pre_alloc_blocks;
  ulonglong  block_length;
  uint    block_size;
  uint    key_cache_id;
};

三、InnoDB

1. 數據文件

InnoDB 存儲引擎的數據文件由數據和索引兩部分組成。數據文件的命名規則為表名加上擴展名 .ibd。與 MyISAM 不同的是,InnoDB 將數據和索引都存儲在一個數據文件中。

/*******************************************************************************
 InnoDB 數據文件格式
*******************************************************************************/
struct Fil_header {
  ulint   state;  
  ulint   space_id;   
  ulint   size;   
  ulint   page_size;   
  ulint   zip_size; 
...
};

2. 數據頁

InnoDB 存儲數據的基本單位是頁(page),頁的大小默認為 16KB。InnoDB 存儲引擎使用了 B+ 樹搜索演算法來管理數據頁,在同一索引樹上只有一個小範圍鎖。

/*******************************************************************************
 InnoDB 數據頁格式
*******************************************************************************/
struct page_header_t {
  page_t:unsigned magic_n:16;  /* Magic number */
  page_t:unsigned ofs_n:16;    /* Offset to page directory end */
  page_t:unsigned next:32;     /* Next page */
  page_t:unsigned prev:32;     /* Previous page */
  page_t:unsigned btr_seg_leaf:32; 
  page_t:unsigned free_offset:16;  /* Start of the free list in bytes */
  page_t:unsigned garbage_offset:16;  /* Start of garbage in bytes */
  page_t:unsigned n_directions:16;  /* Number of FSEG "directions" */
  page_t:unsigned heap_top:32;  /* Address of highest heap byte */
  page_t:unsigned reserved_3:2;
  page_t:unsigned heap_no:14;  /* Current heap number */
  page_t:unsigned trx_id:32;  /* Rollback segment id */
  page_t:unsigned trx_offset: 14; /* Rollback segment header offset */
  page_t:unsigned file_page_offset: 18;  
  page_t:unsigned zip_size: 24;
  page_t:unsigned space_id: 26;
  page_t:unsigned reserved_4: 6;
  page_t:unsigned page_zip: 1;
 ...  
};

3. 事務處理機制

為了支持事務,InnoDB 存儲引擎引入了 MVCC(多版本並發控制)機制。MVCC 使多個事務可以同時讀取同一行記錄,同時允許事務並發地進行修改操作。

/*******************************************************************************
 InnoDB 事務處理機制
*******************************************************************************/
struct trx_sys_t
{
  trx_id_t    max_trx_id; 
  trx_id_t    purge_trx_id;   
  ulint     max_trx_undo_size;
};

4. 共享表空間

InnoDB 存儲引擎可以使用單一的共享表空間(Table Space),將多個表的數據和索引存儲在一個文件中,這種方式使得表與表之間的數據互相獨立,可靠性更高。

/*******************************************************************************
 InnoDB 共享表空間格式
*******************************************************************************/
struct tablespace_t
{
  space_t   *space;
  ib_string   file_path;
  ib_string   name;
  ulint     flags;
  srv_minor_ver_t  frm_ver;
};

四、總結

MySQL 資料庫的數據結構非常複雜,本文只粗略地介紹了 MyISAM 和 InnoDB 存儲引擎的一些數據結構。在使用 MySQL 資料庫時,需要根據具體的需求選擇合適的存儲引擎。同時,也需要了解每個存儲引擎的數據結構,以便更好地進行資料庫設計和性能優化。

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
GRQOP的頭像GRQOP
上一篇 2025-04-23 00:48
下一篇 2025-04-23 00:48

相關推薦

  • 如何修改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

發表回復

登錄後才能評論