问答题479/1053InnoDB主键索引跟非主键索引在数据存储上的差异

难度:
2021-11-02 创建

参考答案:

InnoDB 存储引擎中,主键索引(Clustered Index)和 非主键索引(Secondary Index)在数据存储上的差异是非常重要的,它们影响数据库的性能和存储结构。下面详细讲解它们在数据存储上的不同:

1. 主键索引(Clustered Index)

  • 数据存储顺序:在 InnoDB 中,主键索引是聚集索引,意味着表中的数据行是按照主键的顺序存储的。换句话说,数据本身是按照主键索引的顺序进行存储的,主键索引的叶子节点包含了实际的数据行。

    • 数据存储结构:主键索引的叶子节点存储的是实际数据(即记录),而不是指向数据的指针。每一行数据的存储顺序与主键索引的顺序一致。
    • 主键必须唯一且非空:每张 InnoDB 表必须有一个主键,且主键值不能重复和为空。如果用户没有显式定义主键,InnoDB 会自动生成一个隐式的主键(通常是一个隐藏的自动增长 ID)。
  • 存储示例:如果一个表有主键 id,数据行存储的顺序就是按照 id 从小到大的顺序排列。例如:

    id   name
    1    Alice
    2    Bob
    3    Charlie
    

2. 非主键索引(Secondary Index)

  • 数据存储顺序:非主键索引是 二级索引,它不影响数据的存储顺序,数据行的存储依然是按照主键索引的顺序进行的。非主键索引是指向数据行的 指针,并不包含数据行本身。

    • 存储结构:非主键索引的叶子节点存储的是 主键值(而不是数据本身)。因此,非主键索引的每个条目实际上是一个包含了索引列值和该行数据对应的主键值的记录。这是因为非主键索引不能直接存储数据,它们需要通过主键值来访问数据行。
    • 非主键索引的指向:非主键索引会存储指向主键的指针,这些指针指向主键索引中对应的行。因此,通过非主键索引查找数据时,实际上需要两次查找:一次是通过非主键索引找到主键值,另一次是通过主键值查找实际数据。
  • 存储示例:假设有一个表,非主键索引在 name 列上创建。数据表存储如下:

    id   name
    1    Alice
    2    Bob
    3    Charlie
    

    对应的非主键索引(name)存储的是:

    name   id
    Alice  1
    Bob    2
    Charlie 3
    

    当通过 name 查找数据时,实际上会通过 name 找到对应的 id,然后再通过 id 查找实际的数据行。

3. 差异总结:

特性主键索引(Clustered Index)非主键索引(Secondary Index)
数据存储数据行存储在叶子节点,按主键顺序排列。叶子节点只存储索引字段值和指向主键的指针。
索引结构聚集索引,数据本身包含在主键索引中。二级索引,索引值指向主键,不能直接包含数据。
存储空间需要较少的存储空间,因为没有重复的主键值。需要更多的存储空间,因为每个非主键索引项都包含一个主键值。
查找效率高效的查找,因为数据和主键索引在一起。查找效率相对较低,因需要两次查找:一次通过非主键索引找到主键值,再通过主键索引查找数据。
创建时机必须存在,每个表只能有一个主键索引。可选,表可以有多个非主键索引。

4. 存储结构对性能的影响

  • 主键索引的性能:由于数据行是按照主键顺序存储的,查找、插入、更新和删除操作会在主键索引中直接操作数据,效率较高。
  • 非主键索引的性能:非主键索引查找的过程需要两次查找,首先通过非主键索引查找主键,然后再通过主键索引查找实际数据,这种方式会比聚集索引略慢。但是,非主键索引适用于快速查找某个特定字段的值,尤其是当字段上有高选择性时。

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