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

对于数据库这一块询问比较多的就是在 MySQL 中怎么去选择一种何时当前业务需求的存储引擎 , 而 MySQL 中支持的存储引擎又有很多种 , 那么 MySQL 中分别又有那些 , 怎么优雅的使用呢?
划分引擎原因在文件系统中 , MySQL 将每个数据库(也可以称之为 schema )保存为数据目录下的一个子目录 。创建表时 , MySQL 会在数据库子目录下创建一个和表同名的 .frm 文件保存表的定义 。例如创建一个名为 DebugTable 的表 , MySQL 会在 DebugTable.frm 文件中保存该表的定义 。
【怎么优雅的选择 MySQL 存储引擎】因为 MySQL 使用文件系统的目录和文件来保存数据库和表的定义 , 大小写敏感性和具体的平台密切相关 。在 windows 系统中 , 大小写是不敏感的;而在类 Unix 系统中则是敏感的 。不同的存储引擎保存数据和索引的方式是不同的 , 但表的定义则是在 MySQL 服务层wk统一处理的 。
查看支持引擎想了解 MySQL 中支持的引擎的情况 , 可以使用如下命令查看:
show engines;结果如下(MySQL版本:Ver 8.0.19):
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 两个引擎 , 其中针对于以上讲到的存储引擎 , 如下表进行对比:

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

文章插图
 
MyISAM 与 InnoDB 区别两种类型最主要的差别是InnoDB支持事务处理与外键和行级锁 。
  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则无此问题 , 但这并非因为它比较先进 , 这只是因为它不支持事务 。
应用场景