数据库面试二

2.存储引擎

1.InnoDB

默认的存储引擎:

互联网公司的表没有意外都是使用该引擎

特点:

1.支持事务,支持物理外键

2.天生支持行锁,手动支持表锁

3.使用聚簇(集)索引

​ 3.1:索引跟数据在同一个文件(表名.ibd)

​ 3.2: 只有主键索引是聚簇索引,其他索引都是非聚簇索引

表锁:

用于控制对整个数据库表的并发访问。当一个事务对表加锁后,其他事务在访问该表时会受到限制,具体限制取决于锁的类型。虽然 InnoDB 引擎默认以行级锁(Row-Level Locking)为主,但它仍然支持手动显式使用表锁,以满足某些特定场景的需求。

  • 表锁是对整个表的粗粒度锁定,适用于全表操作或需要强制独占的场景。
  • InnoDB 默认优先使用行级锁,仅在手动显式调用 LOCK TABLES 或执行 DDL 时使用表锁。
  • 使用表锁需谨慎,长时间持有会导致并发性能下降,甚至引发阻塞。
  • 在常规高并发场景中,应优先依赖行级锁和事务隔离级别(如 MVCC)保证数据一致性。

行锁:

(Row-Level Lock) 是一种细粒度的锁机制,用于控制对表中单行数据的并发访问。它允许多个事务同时操作同一张表的不同行,从而提升并发性能,避免因粗粒度锁(如表锁)导致的资源争用。

聚簇(集)索引:

定义

  • 数据与索引绑定:聚簇索引的叶子节点直接存储数据行,索引的键值顺序决定了表中数据的物理存储顺序。
  • 唯一性:一个表只能有一个聚簇索引(因为数据只能按一种物理顺序存储)。

核心特点

  • 主键默认是聚簇索引:在InnoDB引擎中,主键自动成为聚簇索引。
  • 高效的主键查询:通过主键检索数据时,无需二次查找,直接返回数据行。
  • 插入性能依赖主键顺序:如果主键是自增的(如AUTO_INCREMENT),插入操作只需追加数据,减少页分裂;若主键无序,可能导致频繁页分裂,降低性能。

非聚簇(集)索引:

定义

  • 索引与数据分离:非聚簇索引的叶子节点不存储实际数据行,而是存储指向数据行的指针(或主键值)。
  • 灵活性:一个表可以有多个非聚簇索引。

核心特点

  • 二级索引:在InnoDB中,非聚簇索引称为二级索引,其叶子节点存储主键值,而非数据行的物理地址。

  • 回表查询(Bookmark Lookup):通过非聚簇索引查询数据时,需先找到主键值,再通过主键到聚簇索引中查找完整数据行。

  • 覆盖索引优化:若查询字段全部包含在索引中(如SELECT id FROM table WHERE name='Alice'),可避免回表,直接返回结果。

  • 聚簇索引:数据与索引绑定,适合主键查询和范围扫描,但插入性能依赖主键顺序。

  • 非聚簇索引:数据与索引分离,适合辅助查询,需注意回表开销。

  • 核心差异:数据存储位置、索引数量限制和查询效率。

2.MyISAM

特点

1.不支持事务,不支持外键

2.只支持表锁,不支持行锁

3.使用非聚簇索引

​ 3.1:索引和数据不在一个文件

​ 3.2:数据(表名.myd)

​ 3.3:索引(表名.myi)

3.面试题

以上两种储存引擎的区别:

根据两种引擎的特点进行比较。****

posted @ 2025-03-10 14:35  留梦&  阅读(10)  评论(0)    收藏  举报