MySQL新手向:对比常用存储引擎

前言

为什么MySQL拥有的存储引擎有那么多,偏偏最常用的是InnoDB呢?带着这个问题,让我们对比几种常用的存储引擎,理解InnoDB的优势吧。

一、MyISAM存储引擎

1.1、MyISAM介绍

先说说MyISAM存储引擎的特点:

  • 不支持事务
  • 表锁设计
  • 支持全文索引

再针对它最大特点,为什么不支持事务,我们来具体说说为什么?

MyISAM 存储引擎之所以不支持事务(ACID特性),主要是因为它的设计目标是那些对数据库的查询操作远多于修改操作的应用。所以在设计上,MyISAM 强调的是简单性和速度,而不是数据的一致性或回滚能力,这使得它非常适合用于只需要很少写入操作或者写入操作不会频繁导致需要回滚的场景。

1.2、为什么不支持事务?

接下来我们再根据以下是几个关键点来解释为什么 MyISAM 不支持事务:

  1. 性能优化 :MyISAM在它的缓冲池中只缓存索引页而不是实际的数据页,这减少了内存使用并提高了查询速度。如果是事务处理,则需要额外的开销,如记录日志以便在失败时可以恢复到某个一致的状态,而这对于 MyISAM 来说是一种不必要的负担。
  2. 简单性:事务处理增加了复杂性,需要实现锁定机制、日志系统等,而这些都不适合 MyISAM 这种旨在提供快速查询的设计理念。
  3. 表级锁定:MyISAM 使用表级锁定,这意味着当一个用户正在更新一个表的时候,其他想要更新相同表的用户必须等待,直到当前的更新完成。这种锁定机制简单且易于实现,但是不适合需要行级锁定的事务处理。
  4. 数据一致性:事务的主要目的是保证数据的一致性,即使是在系统崩溃的情况下也能恢复数据。而 MyISAM 没有提供这样的保护措施,因此在某些情况下可能会导致数据丢失或损坏。

尽管 MyISAM 在某些方面存在限制,但它仍然非常适合那些不需要事务特性的应用。例如,在构建数据仓库或是任何只需要读取大量数据而不经常修改数据的应用时,MyISAM 可能是一个不错的选择。

随着 MySQL 的发展,InnoDB 成为了 MySQL 5.5.8 及更高版本中的默认存储引擎,因为它支持事务处理,并提供了更高级的功能,如行级锁定和外键支持。然而,这并不意味着 MyISAM 完全过时了,它仍然有其适用的场景。

二、Memory存储引擎

见名知意,内存存储引擎,代表着它最大的特点就是将表中的数据存放在内存中,但是因此它也是非常危险的,如果数据库重启或系统崩溃,则会导致表中数据全部消失。因此,它其实的话,非常适合于存储临时数据的临时表,以及数仓系统中的经纬度表。

虽说Memory存储速度非常快,但是在使用上仍然是有一定限制,如:只支持表锁,并发性差,不支持text和blob列类型。

三、InnoDB存储引擎

InnoDB存储引擎支持事务,其设计目的在于面向在线事务处理的应用。其特点为:

  • 行级锁定:这使得InnoDB能够支持高并发的写操作,相比于MyISAM的表级锁定,行级锁定大大减少了操作间的冲突。
  • 支持外键:外键约束加强了数据库中表与表之间的参照完整性。
  • 非锁定读取:InnoDB通过多版本并发控制(MVCC)技术实现了非阻塞性的读操作,这使得读取请求不会因写操作而被延迟。
  • 四种隔离级别:InnoDB支持SQL标准定义的所有四种隔离级别,通过next-key locking机制防止了幻读现象的发生。
  • 高级功能:诸如插入缓冲、二次写机制、自适应哈希索引以及预读等特性,都提升了InnoDB的性能和可用性。
  • 聚集索引:InnoDB按照主键顺序存储表中的数据。若无显式指定主键,则会自动生成一个6字节的ROWID作为主键。

在MySQL5.5.8开始,已成为了默认的存储引擎。

四、为什么MySQL采用了InnoDB?

MySQL最初提供了多种存储引擎供用户选择,每种引擎都有其特点和适用场景。MyISAM曾经是默认的存储引擎,但是随着技术的发展和需求的变化,InnoDB逐渐成为了MySQL中的默认存储引擎,并且在大多数场景下被推荐使用。以下是几个原因:

  1. 事务支持: InnoDB支持事务处理,这是现代数据库系统的关键功能之一。事务处理确保了数据操作的原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),即所谓的ACID特性。这对于需要可靠性和一致性的应用程序来说至关重要。
  2. 并发控制: InnoDB使用行级锁定机制来管理并发访问,这允许更高的并发性,尤其是更适合现在网络环境这种高工作负载下。相比之下,MyISAM使用表级锁定,这意味着当一个线程正在更新表时,其他所有线程都必须等待。
  3. 多版本并发控制(MVCC): InnoDB还实现了MVCC,允许读取操作与写入操作并行进行而不会互相阻塞。这种机制使得读取操作可以查看之前版本的数据,而不会干扰正在进行的写入操作。
  4. 恢复机制: InnoDB有一个内置的恢复机制,能够在系统崩溃后自动恢复未完成的事务,并确保已提交的事务数据的完整性。
  5. 外键支持: InnoDB支持外键约束,这有助于保持数据库内数据的一致性。外键可以强制执行引用完整性,确保在插入或删除记录时不会破坏关系。

五、总结

总之,选择哪种存储引擎取决于具体的应用场景和需求。虽然InnoDB功能强大,但在某些特定情况下,如只需要基本的查询功能时,MyISAM仍是一个合理的选择。了解各种存储引擎的特点和适用场景,可以帮助我们做出更为高性价比的选择。

最后的最后,希望这次的学习能够帮助到你。

相关推荐
Amctwd1 分钟前
【SQL】如何在 SQL 中统计结构化字符串的特征频率
数据库·sql
betazhou37 分钟前
基于Linux环境实现Oracle goldengate远程抽取MySQL同步数据到MySQL
linux·数据库·mysql·oracle·ogg
lyrhhhhhhhh1 小时前
Spring 框架 JDBC 模板技术详解
java·数据库·spring
喝醉的小喵2 小时前
【mysql】并发 Insert 的死锁问题 第二弹
数据库·后端·mysql·死锁
付出不多3 小时前
Linux——mysql主从复制与读写分离
数据库·mysql
初次见面我叫泰隆3 小时前
MySQL——1、数据库基础
数据库·adb
Chasing__Dreams3 小时前
Redis--基础知识点--26--过期删除策略 与 淘汰策略
数据库·redis·缓存
源码云商3 小时前
【带文档】网上点餐系统 springboot + vue 全栈项目实战(源码+数据库+万字说明文档)
数据库·vue.js·spring boot
源远流长jerry3 小时前
MySQL的缓存策略
数据库·mysql·缓存
纯纯沙口4 小时前
Qt—用SQLite实现简单的注册登录界面
数据库·sqlite