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