怎么优雅的选择 MySQL 存储引擎

友情提示:此篇文章大约须要阅读 8分钟53秒,不足之处请多指教,感谢你的阅读。订阅本站mysql

此文章首发于 Debug客栈 |https://www.debuginn.cnsql

对于数据库这一块询问比较多的就是在 MySQL 中怎么去选择一种什么时候当前业务需求的存储引擎,而 MySQL 中支持的存储引擎又有不少种,那么 MySQL 中分别又有那些,怎么优雅的使用呢?数据库

划分引擎缘由

在文件系统中,MySQL 将每一个数据库(也能够称之为 schema )保存为数据目录下的一个子目录。建立表时,MySQL 会在数据库子目录下建立一个和表同名的 .frm 文件保存表的定义。例如建立一个名为 DebugTable 的表,MySQL 会在 DebugTable.frm 文件中保存该表的定义。缓存

由于 MySQL 使用文件系统的目录和文件来保存数据库和表的定义,大小写敏感性和具体的平台密切相关。在 Windows 系统中,大小写是不敏感的;而在类 Unix 系统中则是敏感的。不一样的存储引擎保存数据和索引的方式是不一样的,但表的定义则是在 MySQL 服务层wk统一处理的。并发

查看支持引擎

想了解 MySQL 中支持的引擎的状况,可使用以下命令查看:app

show engines;

结果以下(MySQL版本:Ver 8.0.19):ide

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)

存储引擎分类

MySQL 存储引擎分类有 MyISAM、InnoDB、Memory、Merge等,能够看上面表中列出的支持引擎,可是其中最为经常使用的就是 MyISAM 和 InnoDB 两个引擎,其中针对于以上讲到的存储引擎,以下表进行对比:
image.png性能

MyISAM 与 InnoDB 区别

两种类型最主要的差异是InnoDB支持事务处理与外键和行级锁。spa

  1. InnoDB 可借由事务日志( Transaction Log )来恢复程序崩溃( crash ),或非预期结束所形成的数据错误;
    而 MyISAM 遇到错误,必须完整扫描后才能重建索引,或修正未写入硬盘的错误。
  2. InnoDB 的修复时间,通常都是固定的,但 MyISAM 的修复时间,则与数据量的多寡成正比。
  3. 相对而言,随着数据量的增长InnoDB有较佳的稳定性
  4. MyISAM 必须依靠操做系统来管理读取与写入的缓存,而 InnoDB 则是有本身的读写缓存管理机制。( InnoDB 不会将被修改的數據頁当即交给操做系统)所以在某些状况下,InnoDB 的数据访问会比 MyISAM 更有效率
  5. InnoDB 目前并不支持 MyISAM 所提供的压缩与 terse row formats(简洁的行格式) ,因此对硬盘与高速缓存的使用量较大
  6. 当操做彻底兼容 ACID(事务)时,虽然 InnoDB 会自动合并数笔链接,但每次有事务产生时,仍至少须写入硬盘一次,所以对于某些硬盘或磁盘阵列,会形成每秒 200 次的事务处理上限。
    若但愿达到更高的性能且保持事务的完整性,就必使用磁盘缓存与电池备援。
    固然 InnoDB 也提供数种对性能冲击较低的模式,但相对的也会下降事务的完整性。而MyISAM则无此问题,但这并不是由于它比较先进,这只是由于它不支持事务。

应用场景

  • MyISAM 管理非事务表。它提供高速存储和检索,以及全文搜索能力。若是应用中须要执行大量的 SELECT 查询,那么 MyISAM 是更好的选择。
  • InnoDB 用于事务处理应用程序,具备众多特性,包括 ACID 事务支持。若是应用中须要执行大量的 INSERT 或 UPDATE 操做,则应该使用 InnoDB,这样能够提升多用户并发操做的性能。

参考文章

相关文章
相关标签/搜索