面试遇到MySQL 存储引擎有哪几种,他们的区别是什么?

前言

MySQL存储引擎是用来管理数据存储的组件,不同的存储引擎有不同的特点和适用场景。以下是 MySQL 常见的4种存储引擎及其区别:

一、大致描述

1)MyISAM

MyISAM 是 MySQL 的默认存储引擎,支持表级锁定和全文本搜索。它非常适合读多写少的应用场景,因为在写入数据时需要锁定整个表,因此并发性能相对较差。此外,MyISAM 不支持事务和行级锁定,因此不适合处理大量写入和并发操作的应用。

2)InnoDB

InnoDB 是 MySQL 的另一个流行的存储引擎,支持事务、行级锁定和外键约束。它适合处理高并发的 OLTP(联机事务处理)应用,能够提供更好的并发性和容错性。由于 InnoDB 支持行级锁定,所以多个用户可以同时读取同一张表中的不同行,提高了并发性能。另外,它还支持事务,可以保证数据的一致性和完整性。但 InnoDB 存储引擎的空间利用率较低,会占用更多的存储空间。

3)Memory

Memory 存储引擎它将数据存储在内存中,适合用于处理临时数据,如缓存、临时表等。由于数据存储在内存中,所以 Memory 存储引擎的读写速度非常快,但是也有一个缺点,就是如果服务器宕机,数据将会丢失。

4)Archive

Archive 存储引擎适合用于存储大量历史数据,它采用压缩算法存储数据,能够大幅减少存储空间。由于压缩算法的影响,Archive 存储引擎不支持索引、更新和删除操作,只能进行插入和查询。

二、适用场景

1)MyISAM

适用场景:

MyISAM 存储引擎适合用于读多写少的应用场景。它不支持事务和行级锁定,但具有较快的读取速度和较低的系统开销。

建议用例:

静态网站、博客平台、报表生成和日志记录等对数据一致性要求不高、以读取为主的应用。

2)InnoDB

适用场景:

InnoDB 存储引擎适合用于处理高并发的 OLTP(联机事务处理)应用。它支持事务、行级锁定和外键约束,具有较好的并发性能和数据完整性,适合处理频繁的读写操作和事务处理。

建议用例:

在线交易处理、用户账户、订单管理系统等需要高并发读写和数据一致性的应用。

3)Memory

适用场景:

Memory 存储引擎适用于需要快速读写操作、对持久性要求不高的场景。由于数据存储在内存中,读写速度非常快,但在服务器宕机时会导致数据丢失。

建议用例:

缓存数据、临时表、会话存储等需要高速数据访问和临时存储的应用。

4)Archive

适用场景:

Archive 存储引擎适用于数据存档和归档的场景,特别适合长期存储数据和读取频率较低的情况。它使用 zlib 压缩算法对数据进行高度压缩,节省存储空间。

建议用例:

日志存储、事件追踪和数据归档等需要存储大量数据且读取频率较低的应用。Archive 存储引擎在处理大量的插入操作方面非常高效。
请注意,Archive 存储引擎不适合频繁的查询和更新操作,因为它不支持索引和修改已有数据。如果您需要经常进行数据检索和修改,或者需要支持复杂的查询条件和索引,其他存储引擎(如 InnoDB 或 MyISAM)可能更适合您的需求。

需要注意的是,具体选择适合的存储引擎取决于应用的需求和性能要求。在实际应用中,也可以根据表的特点和使用模式将不同的存储引擎用于不同的表。例如,将事务性较高的表使用 InnoDB 存储引擎,将只读数据使用 MyISAM 存储引擎,以最大程度地满足应用的要求。

三、切换和查询表的数据库引擎

要切换和查询表的数据库引擎,您可以按照以下步骤进行操作:

查询当前表的数据库引擎:可以使用以下 SQL 查询语句来查看表的数据库引擎:

SHOW TABLE STATUS LIKE 'table_name';

将 “table_name” 替换为您要查询的表名。在结果中,可以查看 “Engine” 列,它将显示当前表使用的数据库引擎。

切换表的数据库引擎:如果要切换表的数据库引擎,您需要执行以下步骤:

a. 创建一个具有目标数据库引擎的新表:使用 CREATE TABLE 语句创建一个具有目标数据库引擎的新表,并将数据从原表复制到新表。例如,如果要将表从 MyISAM 切换到 InnoDB,可以执行以下步骤:

CREATE TABLE new_table_name ENGINE=InnoDB SELECT * FROM old_table_name;

将 “new_table_name” 替换为新表的名称,“old_table_name” 替换为原表的名称。

b. 重命名原表和新表:如果复制数据成功,并且您希望将新表作为原表的替代,请执行以下步骤:

RENAME TABLE old_table_name TO old_table_name_backup, new_table_name TO old_table_name;

这将重命名原表为 “old_table_name_backup”,并将新表重命名为原表的名称,从而将新表替换原表。

c. 删除备份表(可选):如果您不再需要备份表,可以执行以下步骤删除备份表:

DROP TABLE old_table_name_backup;

这将删除备份表,只保留切换后的新表。

请注意,在执行此类操作之前,确保对表数据进行备份,并且明确了切换数据库引擎的原因和影响。此外,根据表的大小和数据量,切换过程可能需要一些时间,因此请在合适的时机执行,并确保没有正在进行的重要操作。

四、名词解释

1)事务(Transaction)

是指作为一个逻辑工作单元执行的一系列数据库操作。事务可以包含一条或多条对数据库的读取、写入和修改等操作,它们作为一个不可分割的单元被视为一个整体进行处理。

事务的四个特性通常被称为 ACID 特性:

原子性(Atomicity):事务中的所有操作要么全部成功执行,要么全部回滚,保证事务的操作要么全部完成,要么完全不执行。

一致性(Consistency):事务开始之前和结束之后,数据库的状态必须保持一致。在事务执行过程中,数据的完整性约束不能被破坏。

隔离性(Isolation):多个事务并发执行时,每个事务都应该与其他事务隔离开,互相之间不会产生干扰。每个事务应该感知不到其他事务的存在,就像它们是独立执行的一样。

持久性(Durability):一旦事务提交,其所做的修改将永久保存在数据库中,即使发生系统故障或重启,也能够保证数据的持久性。

事务的目的是确保数据操作的一致性和完整性。通过将一系列操作作为事务进行处理,可以避免因为意外情况(如系统故障、并发操作冲突等)导致数据的不一致性。如果事务中的任何一部分操作失败,整个事务将会回滚到初始状态,不会对数据库产生任何影响。只有当所有操作都成功完成时,事务才会被提交,将修改永久保存到数据库中。

2)外键约束(Foreign Key Constraint)

是数据库中的一种关联性约束,用于建立表与表之间的关联关系。外键约束定义了一个表的列或列组合,其值必须与另一个表的主键或唯一键值相匹配。

通过外键约束,可以确保在建立表之间的关联关系时,数据的完整性和一致性得到保证。当一个表的列作为外键时,它可以引用另一个表的主键或唯一键。这样,当对主表(被引用表)进行增删改操作时,会自动触发相应的约束操作,以保证数据的一致性。

外键约束可以执行以下操作:

插入操作:只允许插入具有在引用表中存在对应主键或唯一键的值的行。
更新操作:当引用表中的主键或唯一键值被更新时,会自动更新具有该外键的表中对应的外键值。
删除操作:可以指定外键的级联操作,当引用表中的主键或唯一键值被删除时,可以自动删除具有该外键的表中对应的行,或者进行级联更新。
外键约束有助于确保数据库中的数据一致性,防止出现不符合关联关系的数据。它是一种重要的数据完整性约束机制,常用于设计和维护复杂数据库模型中的关系。

猜你喜欢

转载自blog.csdn.net/qq_41866988/article/details/130583999