存储引擎概念:用来处理数据库相关的 CRUD 操作。

  • 可以通过 SHOW ENGINES; 命令查看当前 MySQL 支持的存储引擎。InnoDB 是 MySQL 的默认存储引擎,创建表的时候如果不指定存储引擎,默认使用 InnoDB。

image.png

  • 启动时可以禁用某些存储引擎。

推荐使用 InnoDB 存储引擎,其他存储引擎已经不在维护和开发,存在很多问题。

CSV 存储引擎

数据存储以 CSV 文件。

特点:

  • CSV 是一种表准文件格式(CSV 文件),文件以存文本形式存储表格数据,不支持特殊字符。
  • CSV 数据的存储用逗号隔开,可直接编辑 CSV 文件进行数据的编排,数据安全性低。编辑之后,要生效使用 flush table XXX 命令。
  • 不能定义索引、列定义必须为 NOT NULL、不能设置自增列, 不适用大表或者数据的在线处理。

应用场景:

  • 数据的快速导出导入。
  • 表格直接转换成 表格直接转换成 CSV。

Archive 存储引擎

压缩协议进行数据的存储,数据存储为 ARZ 文件格式。

特点:

  • 只支持 insert 和 select 两种操作。
  • 只允许自增 ID 列建立索引。
  • 行级锁。
  • 不支持事务。
  • 数据占用磁盘少。

应用场景:

  • 日志系统。
  • 大量的设备数据采集。

Memory 存储引擎

数据都是存储在内存中,IO 效率要比其他引擎高很多,服务重启数据会丢失,内存数据表默认只有 16M,一般我们不会使用到 Memory 存储引擎。

千万不要用 Memory 存储引擎去做缓存, 性能上不及 Redis 和 Memcahced。

特点:

  • 支持 hash 索引,B tree 索引,默认 hash(查找复杂度 0(1)),但仅支持等值查询。
  • 字段长度都是固定长度 varchar(32)=char(32)。
  • 不支持大数据存储类型字段如 blog,text。
  • 表级锁。
  • 不支持事务。
  • Memory 引擎不能禁用,当涉及内部排序操作的临时表时,使用该存储引擎 。
    • max_heap_table_size 决定使用内存的大小,默认是 16M。无论该表使用的什么引擎,只要使用到临时表,或者指定 Memory,都受该参数影响。
    • 当上面设置的内存放不下数据时,MySQL 版本 >= 5.6 的转为 MyISAM 引擎,>=5.7 的转为 InnoDB 引擎。注意磁盘上临时路径空间的大小(tmpdir)。
    • 内存使用为会话(SESSION)级别,当心内核 OOM。
  1. mysql> show global status like "%tmp%tables";
  2. +-------------------------+-------+
  3. | Variable_name | Value |
  4. +-------------------------+-------+
  5. | Created_tmp_disk_tables | 0 | -- 内存放不下,转成磁盘存储的数量,如果过大,考虑增大内存参数
  6. | Created_tmp_tables | 4 | -- 创建临时表的数量
  7. +-------------------------+-------+
  8. 2 rows in set (0.00 sec)
  9. mysql> show variables like 'tmpdir';
  10. +---------------+-------+
  11. | Variable_name | Value |
  12. +---------------+-------+
  13. | tmpdir | /tmp | -- memory转成磁盘存储的路径
  14. +---------------+-------+
  15. 1 row in set (0.00 sec)

应用场景:

  • 等值查找热度较高数据。
  • 在排序、分组等操作中,当数据量小于16M(默认大小),由查询优化器建立的临时表就是 Memory 类型。

MyISAM 存储引擎

MySQL5.5 版本之前的默认存储引擎,较多的系统表也还是使用这个存储引擎,系统临时表也会用到 MyISAM 存储引擎。

特点:

  • 堆表数据结构。
  • 表锁设计。
  • 支持数据静态压缩。
  • 不支持事务。
  • 数据容易丢失。
  • 索引容易损坏,不保证数据文件和索引文件同步更新,所以数据库一些异常宕机、磁盘满了等情况都可能造成数据文件和索引文件数据不一致。
  • select count(*) from table 无需进行数据的扫描。
  • 数据(MYD)和索引(MYI)分开存储。
  • 唯一的优点是:数据文件可以直接拷贝到另一台服务器上使用。**

应用场景:

  • 在排序、分组等操作中,当数量超过一定大小之后,由查询优化器建立的临时表就是 MyISAM 类型,后面这些表都会转为 InnoDB。
  • MySQL 一些系统表在 5.6 5.7 版本中还是使用的 MyISAM 存储引擎,历史原因,后面些表都会转为 InnoDB
  • 报表,数据仓库。

InnoDB 存储引擎

MySQL 5.5 及以后版本的默认存储引擎。

特点:

  • 事务 ACID。
  • 行级锁。
  • 聚集索引(主键索引)方式进行数据存储。
  • 支持外键关系保证数据完整性。

对比

Feature MyISAM Memory InnoDB Archive NDB
B-tree indexes Yes Yes Yes No No
Backup/point-in-time recovery(note 1) Yes Yes Yes Yes Yes
Cluster database support No No No No Yes
Clustered indexes No No Yes No No
Compressed data Yes (note 2) No Yes Yes No
Data caches No N/A Yes No Yes
Encrypted data Yes (note 3) Yes (note 3) Yes (note 4) Yes (note 3) Yes (note 3)
Foreign key support No No Yes No Yes (note 5)
Full-text search indexes Yes No Yes (note 6) No No
Geospatial data type support Yes No Yes Yes Yes
Geospatial indexing support Yes No Yes (note 7) No No
Hash indexes No Yes No (note 8) No Yes
Index caches Yes N/A Yes No Yes
Locking granularity Table Table Row Row Row
MVCC No No Yes No No
Replication support (note 1) Yes Limited (note 9) Yes Yes Yes
Storage limits 256TB RAM 64TB None 384EB
T-tree indexes No No No No Yes
Transactions No No Yes No Yes
Update statistics for data dictionary Yes Yes Yes Yes Yes

作者:殷建卫 链接:https://www.yuque.com/yinjianwei/vyrvkf/ivm8gf 来源:殷建卫 - 架构笔记 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。