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.面试题
以上两种储存引擎的区别:
根据两种引擎的特点进行比较。****