MySQL之索引-01

89 阅读5分钟

InnoDB索引与MyISAM索引实现的区别

在MySQL中,InnoDB和MyISAM是两种常见的存储引擎。它们在索引实现上有一些显著的区别:

  1. 索引类型:InnoDB支持事务,因此它使用聚簇索引(Clustered Index)来存储数据。聚簇索引将数据行与主键索引紧密地结合在一起,这意味着数据行的物理顺序与主键的顺序相同。而MyISAM不支持事务,它使用非聚簇索引(Non-Clustered Index),数据行和索引是分开存储的。
  2. 锁定机制:InnoDB支持行级锁定(Row-Level Locking),这意味着在执行写操作时,只有被修改的数据行被锁定,其他行仍然可以被访问。而MyISAM使用表级锁定(Table-Level Locking),在执行写操作时,整个表都会被锁定,导致其他用户无法访问该表。
  3. 数据完整性:InnoDB支持外键约束(Foreign Key Constraints),这有助于确保数据的完整性。而MyISAM不支持外键约束。

MySQL中没有创建索引的数据表是否会创建B+树?

在MySQL中,如果一个数据表没有创建任何索引,那么它不会创建B+树。B+树是一种用于存储索引的数据结构,如果没有索引,就没有必要创建B+树。然而,对于InnoDB存储引擎,即使没有明确创建主键索引,它仍然会为每个表隐式地创建一个聚簇索引。这意味着InnoDB表至少会有一个B+树。

聚簇索引与非聚簇索引的区别

聚簇索引和非聚簇索引是数据库中两种常见的索引类型。它们之间的主要区别如下:

  1. 数据存储方式:聚簇索引将数据行与主键索引紧密地结合在一起,这意味着数据行的物理顺序与主键的顺序相同。而非聚簇索引中,数据行和索引是分开存储的,索引中只包含对应数据行的指针。
  2. 数据访问速度:由于聚簇索引的数据行与主键索引紧密结合,因此在主键查找时,聚簇索引通常具有更快的数据访问速度。而非聚簇索引需要额外的步骤来访问数据行,可能导致性能较差。
  3. 索引数量:一个表只能有一个聚簇索引,因为数据行的物理顺序只能与一个索引相对应。而非聚簇索引可以有多个,因为它们只是包含数据行指针的索引。

B+树存储的索引CRUD执行效率

B+树是一种平衡多路搜索树,它在数据库中被广泛用于存储索引。B+树的CRUD执行效率如下:

  1. 创建(Create):在B+树中插入一个新的索引记录时,需要沿着树结构找到合适的叶子节点进行插入。由于B+树是平衡的,插入操作的时间复杂度为O(log n),其中n为索引记录的数量。
  2. 读取(Read):在B+树中查找一个索引记录同样需要沿着树结构进行搜索。查找操作的时间复杂度也为O(log n)。
  3. 更新(Update):更新一个索引记录通常包括查找和插入两个步骤,因此更新操作的时间复杂度为O(log n)。
  4. 删除(Delete):删除一个索引记录需要先查找到该记录,然后将其从B+树中移除。删除操作的时间复杂度为O(log n)。

自增主键与字符串类型主键的区别及影响

在MySQL中,主键是用于唯一标识表中每一行数据的键。主键可以是自增的整数类型(如INT AUTO_INCREMENT)或字符串类型(如VARCHAR)。它们之间的主要区别和影响如下:

  1. 存储空间:自增主键通常占用较小的存储空间,因为整数类型的存储需求通常小于字符串类型。而字符串类型主键可能会占用更多的存储空间,特别是在主键值较长时。
  2. 插入性能:自增主键在插入新数据时具有较好的性能,因为MySQL会自动为新数据分配一个递增的整数值。而字符串类型主键需要手动分配一个唯一值,这可能导致插入性能较差。
  3. 查询性能:自增主键由于其连续性和较小的存储空间需求,通常在查询性能上具有优势。而字符串类型主键可能会导致查询性能较差,特别是在进行范围查询或JOIN操作时。
  4. 可读性:字符串类型主键可能具有更好的可读性,因为它可以包含有意义的信息。而自增主键通常只是一个递增的整数值,对于理解数据的含义没有太大帮助。

自增主键的删除与添加行为

假设我们有一个使用自增主键的数据表,当前最大的主键ID为10。现在我们删除ID为10和9的数据行,然后再添加一条新数据。接下来我们来分析添加新数据后的主键ID是多少。

在MySQL中,自增主键的值由一个名为AUTO_INCREMENT的属性控制。当删除数据行后,AUTO_INCREMENT的值不会自动减小。因此,在本例中,删除ID为10和9的数据行后,AUTO_INCREMENT的值仍然为11。当我们再次插入一条新数据时,新数据的主键ID将为11。如果重启,则以最大值加1!!