MySQL学习总结系列——常见的存储引擎(补充)

本文介绍 MySQL 中的几款存储引擎及使用场景和差异性,关于最常用的 InnoDB 存储引擎会有单独的一篇文章来做梳理总结。

可插拔的存储引擎

mysql engines.png

InnoDB

从 MySQL 数据库 5.5.8 版本开始,InnoDB 存储引擎是默认的存储引擎。

场景

主要面向在线事务处理(OLTP)的应用。

特性

  • 支持事务
  • 行锁设计
  • 支持外键
  • 并支持类似于 Oracle 的非锁定读,即默认读取操作不会产生锁。
  • 插入缓冲
  • 二次写
  • 自适应哈希索引
  • 预读

关于事务和存储

InnoDB 通过使用多版本并发控制(MVCC)来获得高并发性,并且实现了 SQL 标准的 4 种隔离级别,默认为 REPEATABLE 级别。同时,使用一种被称为 next-key locking 的策略来避免幻读(phantom)现象的产生。

对于表中数据的存储,InnoDB 存储引擎采用了聚集(clustered)的方式,因此每张表的存储都是按主键的顺序进行存放。如果没有显式地在表定义时指定主键, InnoDB 存储引擎会为每一行生成一个 6 字节的 ROWID,并以此作为主键。
InnoDB 存储引擎将数据放在一个逻辑的表空间中,这个表空间就像黑盒一样由 InnoDB 存储引擎自身进行管理。

MyISAM

场景

主要面向一些 OLAP 数据库应用。

特性

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

关于存储

MyISAM存储引擎表由 MYD 和 MYI 组成,MYD 用来存放数据文件,MYI 用来存放索引文件。可以通过使用 myisampack 工具来进一步压缩数据文件,因为 myisampack 工具使用赫夫曼(Huffman)编码静态算法来压缩数据,因此使用myisampack工具压缩后的表是只读的,当然用户也可以通过 myisampack 来解压数据文件。
它的缓冲池只缓存(cache)索引文件,而不缓冲数据文件,数据文件的缓存交由操作系统本身来完成,这与其他使用 LRU 算法缓存数据的大部分数据库大不相同。所以 MyISAM 存储引擎的表在做磁盘文件排序时,依赖操作系统的系统调用进行数据读取,成本会更高

Memory

场景

非常适合用于存储临时数据的临时表,以及数据仓库中的纬度表。

特性

  • 将表中的数据存放在内存中,速度非常快,但是如果数据库重启或发生崩溃,表中的数据都将消失。
  • 默认使用哈希索引
  • 只支持表锁,并发性能较差
  • 不支持 TEXT 和 BLOB 列类型
  • 存储变长字段(varchar)时是按照定常字段(char)的方式进行的,因此会浪费内存。

其他

MySQL 数据库使用 Memory 存储引擎作为临时表来存放查询的中间结果集。如果中间结果集大于 Memory 存储引擎表的容量设置,又或者中间结果含有 TEXT 或 BLOB 列类型字段,则 MySQL 数据库会把其转换到 MyISAM 存储引擎表而存放到磁盘中。

Archive

场景

提供高速的插入和压缩功能。非常适合存储归档数据,如日志信息。

特性

  • 只支持 INSERT 和 SELECT 操作
  • 从 MySQL5.1 开始支持索引。

其他

Archive 存储引擎使用 zlib 算法将数据行(row)进行压缩后存储,压缩比一般可达 1∶10。
Archive 存储引擎使用行锁来实现高并发的插入操作,但是其本身并不是事务安全的存储引擎

CSV

CSV 存储引擎可以将 csv 文件作为 mysql 的表进行处理。不支持索引,存储格式就是普通的 csv文件,所有的列必须都是不能为 NULL 的

Fedrated

Federated 存储引擎表并不存放数据,它只是指向一台远程 MySQL 数据库服务器上的表。这非常类似于 SQL Server 的链接服务器和 Oracle 的透明网关,不同的是,当前 Federated 存储引擎只支持 MySQL 数据库表,不支持异构数据库表。

其他

简单的罗列对文章写作来说没有进步。
本文的存储引擎介绍的大多数内容来自《MySQL技术内幕:InnoDB存储引擎》一书

如果觉得本文对您有帮助,请留个红心赞再走,如果有兴趣也可以浏览作者的其他文章。
如果觉得本文浪费了您的时间,希望评论区能留下您的宝贵意见。
如果有疑问也请留言,作者愿花时间和精力去找寻答案,一起探讨。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享