问答题481/1053MyIsam的数据是怎么存储的?

难度:
2021-11-02 创建

参考答案:

MyISAM 是 MySQL 的一种存储引擎,它与 InnoDB 存储引擎在数据存储结构上有很多不同。MyISAM 的存储设计较为简单,主要通过 数据文件索引文件 进行存储,下面详细讲解 MyISAM 的数据存储方式。

1. MyISAM 数据存储结构

MyISAM 使用两种文件来存储表的数据和索引:

  • .MYD 文件(MyData): 存储数据的文件。
  • .MYI 文件(MyIndex): 存储索引的文件。

数据文件(.MYD)

  • 数据存储:在 MyISAM 中,数据存储在 .MYD 文件中。这些数据是以 固定长度的记录格式 存储的,每个表格的数据都按顺序存储在这个文件中。每条记录的存储大小是固定的,这使得 MyISAM 在查询时可以通过计算偏移量来定位数据。
  • 数据存储格式:MyISAM 将每一条数据存储为一条“记录”,并按照 记录顺序 保存在文件中。当插入数据时,数据会被添加到文件的末尾。在没有删除或更新的情况下,数据文件是连续的。

索引文件(.MYI)

  • 索引存储:MyISAM 使用 B+ 树 数据结构来存储索引。每个表的 主键索引(如果存在)和 非主键索引 都存储在 .MYI 文件中。索引文件是独立的,因此索引的读取和数据的读取是分开的。
    • B+ 树索引:MyISAM 索引使用 B+ 树结构来组织数据,索引的叶子节点存储指向数据行的指针,而非叶子节点存储索引字段值。
    • 主键索引和非主键索引:MyISAM 支持主键索引和其他非主键索引。主键索引存储数据的指针,而其他索引存储索引字段和主键指针。MyISAM 允许在表中创建多个非主键索引。

2. MyISAM 数据存储的特点

  • 数据文件与索引文件分开:与 InnoDB 不同,MyISAM 将数据和索引分开存储,这意味着数据的存储和索引的存储是独立的,因此可以对索引进行优化,而不会影响数据本身。
  • 固定长度记录:MyISAM 中的每条记录具有固定长度,这意味着记录之间没有间隙,这使得 MyISAM 适用于小型到中型数据库,但对于具有可变长度字段(如 TEXT、BLOB)的表,可能不是最合适的选择。
  • 没有事务支持:MyISAM 不支持事务,也不支持行级锁,而是使用表级锁。在高并发的写入场景下,MyISAM 的性能可能不如 InnoDB。

3. 数据存储的过程

  • 插入数据:当插入数据时,MyISAM 会将数据追加到 .MYD 数据文件的末尾,索引会根据插入顺序更新。
  • 删除数据:当删除数据时,MyISAM 会标记删除记录为“已删除”,但数据实际上仍然存在于数据文件中。删除的空间不会立即回收,而是会在后续的插入操作中重用。需要使用 OPTIMIZE TABLE 来真正清理这些已删除的记录。
  • 更新数据:MyISAM 对数据更新的处理与删除类似,更新后的数据会写入新的位置,旧的记录标记为已删除。

4. 索引的存储结构

  • 主键索引:如果定义了主键,MyISAM 会在 .MYI 文件中创建一个主键索引(通常是聚集索引)。主键索引将存储数据的 物理位置(指向数据文件中的记录),因此可以快速找到记录。
  • 非主键索引:MyISAM 还允许创建其他索引(如唯一索引、普通索引等),这些索引会存储索引字段和主键值的映射关系。因此,查询非主键字段时,MyISAM 会通过查找索引获得主键值,再通过主键值查找数据行。

5. MyISAM 的锁机制

  • 表级锁:MyISAM 使用 表级锁,这意味着在进行任何插入、删除或更新操作时,MyISAM 会锁住整个表,直到操作完成。这在写操作较少的情况下可能表现良好,但在高并发写入的场景中性能较差。
  • 索引优化:MyISAM 支持索引优化,可以通过创建适当的索引来加速查询。然而,由于没有行级锁,在并发情况下可能会出现性能瓶颈。

6. 文件存储示例

假设我们有一个表 users,包含字段 id, name, 和 email,以及一个主键索引(id)。存储时,MyISAM 会这样操作:

  • 数据文件(users.MYD):存储用户记录,如:
    id   name     email
    1    Alice    alice@example.com
    2    Bob      bob@example.com
    3    Charlie  charlie@example.com
    
  • 索引文件(users.MYI):存储基于主键和其他索引的 B+ 树结构,记录每个索引值和相应数据行的位置。

最近更新时间:2024-12-09