MySQL面试问题:MySQL常用的存储引擎有哪些?有什么区别?

这里是MySQL存储引擎学习计划的详细课程

photo by Chua Bing Quan on Unsplash

感谢您阅读这篇文章。更多面试问题:
https://programmerscareer.com/zh-cn/software-interview-set/

主题:1.1 MySQL存储引擎简介

在 MySQL 中,存储引擎是数据库管理系统使用的底层软件组件,负责创建、读取、更新和删除(CRUD)数据的管理。简单来说,它就是负责数据库中信息的管理。您可以将其视为与磁盘上的文件系统类似的组件。

每个 MySQL 数据库中的表都是使用特定的存储引擎创建的。 MySQL 提供了多种存储引擎,例如 InnoDB、MyISAM、MEMORY 等,可帮助我们选择最合适的一种。

与数据库交互时,我们主要不需要关心存储引擎——我们可以只关注写 SQL 查询。但是,存储引擎的选择会影响数据库的各种特性,例如:

  • 事务支持: 事务允许多次数据修改在数据库中处理为一个单元的工作,或者所有数据修改都被提交到数据库中,或者未被提交。 InnoDB 支持事务,MyISAM 不支持。
  • 锁定级别: 锁定防止多个进程相互干扰。不同的存储引擎使用不同的锁定机制,从行级到表级锁定。
  • 数据持久性和崩溃恢复: 这是数据库在崩溃或电源失败时的恢复能力。 InnoDB 具有强的数据持久性和崩溃恢复能力。

您可能正在问:可以在一个数据库中使用多个存储引擎吗? 是的!事实上,每张表可以使用不同的存储引擎。

主题:1.2 了解 InnoDB 引擎

InnoDB 是 MySQL 的默认存储引擎。它提供了标准的 ACID 事务特性,并且具有行级锁定和外键关系。这些是为什么它在数据完整性和性能方面非常受欢迎的原因。

让我们来详细了解这些特性:

  • ACID 兼容性: ACID 是事务处理的关键概念。它保证数据的完整性和可靠性,并且确保数据在所有操作中保持一致和可靠。
  • 行级锁定: 与 MyISAM 中的表级锁定相比,InnoDB 使用行级锁定,其中每行被修改的过程中锁定该特定行,并允许其他进程修改其他行。
  • 外键关系: 外键强制在数据库中相关的表之间维护引用完整性。换句话说,它帮助防止破坏链接之间的表。

InnoDB 还具有崩溃恢复能力。这意味着 InnoDB 可以自动修正因预 mature 关闭或主要故障而导致的任何不一致性。

在性能方面,InnoDB 使用多版本并发控制(MVCC)来避免在执行 SELECT 语句时需要读锁定。这是在具有忙站点的繁忙网站上非常有帮助的,因为 SELECT 语句非常常见,并且数据完整性是至关重要的。

主题:1.3 了解 MyISAM 引擎

MyISAM 是 MySQL 中最早的存储引擎之一,在 MySQL 版本 5.5 之前,MyISAM 是默认的存储引擎。MyISAM 有一些特别的特性和用例,使它在特定的场景中非常有效。

MyISAM 使用完整的表级锁定来处理 INSERT、UPDATE 和 DELETE 操作。这意味着当行被写入或更新时,整个表,该行是一部分,被锁定,并且其他操作不能在同一表上写入,直到写入或更新过程完成。

虽然这可能被看作是 InnoDB 所提供的行级锁定的缺点,但在读操作远远多于写操作的场景中,表级锁定是完美的。例如,在博客或网站上,大多数时间你只是显示数据,并且数据更新非常少频。

另一项重要特性是 MyISAM 支持全文搜索索引,允许自然语言搜索在字符字段中。虽然 InnoDB 现在也支持这个特性了,但 MyISAM 曾经是全文搜索的主要选择很长时间。

然而,MyISAM 不支持事务和外键约束,这可能是某些应用的重大缺点。此外,它缺少崩溃恢复,因此崩溃可能会导致数据丢失或数据损坏。

主题:1.4 其他 MySQL 存储引擎

除了 InnoDB 和 MyISAM 之外,MySQL 还提供了其他存储引擎,每个引擎都有其特别的优势和最佳使用案例。让我们来了解一下:

  • MEMORY 引擎: 名字就说明了,这个引擎保存所有数据在内存中,提供了非常快的数据访问时间。但是,请记住,使用 MEMORY 引擎的表中的数据在服务器关闭或崩溃时会丢失。它非常适合存储会话或临时数据。
  • CSV 引擎: 这个引擎允许您以逗号分隔值 (CSV) 格式访问数据。您甚至可以使用任何文本编辑器来查看和编辑表中的数据。它不支持索引,因此每行搜索都是全表扫描。
  • ARCHIVE 引擎: 如果您需要存储大量未索引的数据,例如日志,这是您所需要的引擎。它使用压缩来节省空间并以易于备份和传输的方式存储数据。虽然 ARCHIVE 引擎允许简单的 SELECT 和 INSERT 语句,但它不支持事务或能够删除或更新记录。
  • BLACKHOLE 引擎: Blackhole 引擎接受数据,但丢弃它并不存储它。您可能会问,为什么它有用?Blackhole 引擎用于复制到多个从服务器,并且还用于数据库服务器的审计日志。
  • FEDERATED 引擎: Federated 存储引擎允许您访问位于其他数据库上的表。它提供了能够创建一个逻辑数据库的能力,其中包含多个物理服务器。

每个这些引擎都有独特的功能和适用于不同场景的最佳使用案例。这就是 MySQL 的可插拔存储引擎架构的美妙之处——您可以选择最适合您需求的一个。

主题:1.5 存储引擎比较

MySQL 的多种存储引擎,每个存储引擎具有独特的特性集,使其成为适应各种工作负载的灵活选择。现在,我们将比较这些存储引擎,探讨其强项和弱项,并建议适合的场景。

  1. InnoDB vs. MyISAM:在写操作密集或要求事务的工作负载中,InnoDB优于 MyISAM,因为它提供 ACID 事务特性、行级锁定和崩溃恢复。然而,如果工作负载是读密集,并且事务的持久性或原子性不是关键问题,MyISAM可能是有意义的选择。
  2. InnoDB/MyISAM vs. MEMORY:MEMORY 存储引擎通过在内存中存储所有数据来提供 lightning-fast 数据访问,适合存储临时或会话数据。然而,与 InnoDB 和 MyISAM 不同,所有数据在服务器关闭或崩溃时都会丢失。
  3. InnoDB/MyISAM/MEMORY vs. CSV:CSV 存储引擎使数据处理变得更加简单和灵活,因为它允许在任何文本编辑器中编辑数据。然而,由于缺少索引,因此对每行搜索可能会进行全表扫描,并且可能不是对大型工作负载的有效解决方案。
  4. InnoDB/MyISAM/MEMORY/CSV vs. ARCHIVE:当处理大量 seldom-referenced 数据时,例如日志或历史事务,ARCHIVE 存储引擎具有优势,因为它通过压缩数据来节省存储空间。
  5. InnoDB/MyISAM/MEMORY/CSV/ARCHIVE vs. BLACKHOLE 和 FEDERATED:这两个存储引擎相对较特殊,与其他存储引擎相比较:BLACKHOLE 可能有助于审计日志或多主复制,而 FEDERATED 可能有助于创建逻辑上的单个数据库来自多个物理服务器。

记住,选择正确的存储引擎主要取决于您的特定工作负载和应用要求。

主题:1.6 选择正确的存储引擎

选择正确的存储引擎对设置 MySQL 数据库至关重要,因为它可以大大影响应用的性能和可靠性。下面是要考虑的因素:

  • 数据完整性:如果您的应用要求高数据完整性,并且事务需要原子性(所有或者没有),您应该考虑使用 InnoDB 存储引擎,它支持 ACID(原子性、一致性、隔离性、持久性)特性。
  • 全文搜索:如果您计划运行全文搜索查询,MyISAM 和 InnoDB 都支持这些,但具有不同的特性。您需要独立地探索这些特性,以确定它们是否适合您的使用情况。
  • 内存使用:如果您需要最大的读/写速度,并且数据是临时的(例如会话数据),MEMORY 存储引擎,它将所有数据存储在内存中,可能是最佳选择。
  • 大量数据:处理大量 seldom-referenced 或历史数据时,考虑 ARCHIVE 存储引擎,它通过压缩数据来有效地存储数据。
  • 读/写操作比率:评估应用的读/写操作比率。如果读操作明显多于写操作,您可能会从 MyISAM 中受益。然而,InnoDB 更适合写密集的应用。
  • 服务器故障:考虑发生故障时的情况是至关重要的。如果数据持久性是关键问题,InnoDB 应该是您的选择,因为它可以通过事务日志恢复从故障中。然而,MyISAM 不保证数据持久性在故障时。

主题:1.7 回顾和评估

在我们的上一课中,我们深入了解了 MySQL 的各种存储引擎,了解了它们的独特特性并比较了它们基于某些标准。我们已经:

  • 定义了存储引擎是什么并讨论了它们在 MySQL 中的角色。
  • 了解了 InnoDB 和 MyISAM 存储引擎的特性和优势。
  • 探索了其他 MySQL 存储引擎,例如 MEMORY、CSV 和 ARCHIVE 等。
  • 比较了这些存储引擎,以了解它们的最佳使用场景。
  • 讨论了在选择正确的存储引擎时要考虑的因素。

让我们测试一下你的理解,在我们结束这个系列之前:

  1. 问题 1: InnoDB 与 MyISAM 有什么区别,并且在哪些情况下可能会更喜欢使用其中一个?
  2. 问题 2: 描述一种情况,在哪里使用 MEMORY 存储引擎可能会有所帮助?
  3. 问题 3: 如果您有存储大量日志数据的要求,您将选择哪个存储引擎,并且为什么?
  4. 问题 4: 在选择数据库时要考虑的几个因素是什么?

请按顺序回答这些问题。


答案 1: InnoDB 是一个存储引擎,它提供了 ACID(原子性、一致性、隔离性、持久性)完整性支持的事务功能,并且在写密集的应用或需要高数据完整性的场景中非常有用。然而,MyISAM 通常用于读密集的应用,因为它具有更快的读操作。然而,请记,MyISAM 不支持事务和崩溃安全性功能。

答案 2: MEMORY 存储引擎可能会在处理临时数据时非常有用,例如会话数据。因为所有数据都存储在内存中,并且比磁盘存储更快,它提供了极快的访问时间。然而,请记,所有使用此存储引擎的数据在服务器终止或崩溃时都会丢失。

答案 3: ARCHIVE 存储引擎可能会在处理大量偶尔引用数据或日志数据时非常有用。这个存储引擎支持压缩,可以节省大量的存储空间。

答案 4: 在选择数据库时要考虑的因素可能包括:

  • 数据库主要处理的操作类型(读操作或写操作)。
  • 事务支持和崩溃安全性机制是否是必需的。
  • 数据量和接受的访问/读写速度。
  • 特定功能,例如全文索引或 GIS 功能。

English post: https://programmerscareer.com/mysql-interview18/
作者:Wesley Wei – Twitter Wesley Wei – Medium
注意:本文为作者原创,转载请注明出处。

MySQL面试问题:假设创建一个复合索引(a, b, c),如果查询字段a和c,会使用这个复合索引吗? MySQL面试问题:MySQL MVCC的实现原理

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×