您的位置:

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 数据库时,需要根据具体的需求选择合适的存储引擎。同时,也需要了解每个存储引擎的数据结构,以便更好地进行数据库设计和性能优化。