InnoDB 引擎:具备外键支持功能的食物存储引擎
- InnoDB 视为处理巨大数据量的最大性能设计的存储引擎。
- mysql 从 3.23.34a 开始包含 InnoDB 引擎,大于等于5.5之后默认采用 InnoDB 引擎。
- InnoDB 是 mysql 的
默认事务引擎
,它被设计用来处理大量短期(short-lived)事务,可以确保事务的完整提交(Commit)和回滚(Rollback)。 - InnoDB 存储引擎在实际应用中拥有诸多优势,比如操作便利、提高了数据库的性能、维护成本低等。如果由于硬件或软件的原因导致服务器崩溃,那么在重启服务器后不需要进行额外操作,InnoDB 崩溃回复功能能自动将之前提交的内容定型,然后撤销没有提交的进程,重启之后继续从崩溃点开始执行。
MyISAM 引擎:主要的非事务处理存储引擎
- MyISAM 提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但不支持事务、行级锁、外键,是5.5之前默认的存储引擎。
- MyISAM 的优势是访问的速度快,主要用于对事务的完成新没有要求或以 SELECT、INSERT 为主的应用。
- MyISAM 针对数据统计有额外的常数存储,因此针对 count(*) 查询效率特别高
InnoDB 引擎和 MyISAM 引擎如何选择?
- 对比 MyISAM 引擎,InnoDB 处理写操作的效率差一些,并且会占用更多的磁盘空间来保存数据和索引。
- MyISAM 只缓存索引,不缓存真实数据;InnoDB 不仅缓存索引还要缓存真是数据,对内存要求较高,且内存大小对性能有决定性影响。
- 如果我们需要频繁的对表中的数据进行增删改查,则应该优先选择 InnoDB 引擎。
- 如果没有非常特别的原因需要使用其他的存储引擎,则应该优先选择 InnoDB 引擎。
Archive 引擎:用于数据存档的存储引擎
- archive 是归档的意思,仅仅支持插入和查询两种功能(被插入后不能修改)。
- 在 mysql5.5 之后支持索引功能。
- 拥有很好的压缩机制,使用 zlib 压缩库,在记录请求时进行实时压缩,经常被用来作为仓库使用。
- 创建 ARCHIVE 表时,存储引擎会创建名称以表名开头的文件。数据文件的扩展名为
.ARZ
- 根据英文的测试结果来看,同样数据量下,Archive 表比 MyISAM 表要小约 75%,比 InnoDB 表小约 83%。
- Archive 引擎采用了行级锁。支持 AUTO_INCREMENT 列属性。AUTO_INCREMENT 列可以具有唯一索引或非唯一索引,在其他列上创建索引会导致错误。
- Archive 表适合日志和数据采集(档案)类应用,适合存储大量独立的作为历史记录的数据,拥有很高的插入速度,但对查询的支持较差。
CSV 引擎:存储数据时,以逗号分隔各个数据项
- CSV 引擎可以将普通 CSV 文件作为 mysql 的表来处理,但不支持索引。
- CSV 引擎可以作为一种数据交换的机制,非常有用。
- CSV 引擎存储的数据可以之间在操作系统里用文本编辑器或 excel 读取。
- CSV 引擎对于数据的快速导入、导出是有明显优势的。
- CSV 引擎的列不支持 null 值,在创建表时必须将所有列都声明为 not null
Memory 引擎:置于内存的表
- Memory 采用的逻辑介质是内存,响应速度快,生命周期短,但是当 mysqld 守护进程崩溃的时候数据会丢失,因此选择 Memory 存储引擎时需要特别小心。另外要求存储的数据长度是数据长度不变的格式,像 Blob 和 Text 类型的数据不可用(长度不固定)
- Memory 同事支持哈希(HASH)索引和 B+树索引
- 哈希索引进行相等查询时比较快,但是对于范围查询则慢很多。
- 默认使用哈希索引,其速度要比使用B型树(BTREE)索引快。
- 如果希望使用B树索引,可以在创建索引时选择使用。
- Memory 表比 MyISAM 表至少要快一个数量级。
- Memory 表的大小时收到限制的,表大小取决于 max_rows 和 max_heap_table_size 两个参数的影响。其中 max_rows可以在创建表时指定;max_heap_table_size 大小默认是 16MB,可以按需进行扩大。
- Memory 表的数据文件和索引文件分开存储(每个机遇 Memory 存储引擎的表实际对应一个磁盘文件,该文件名与表名相同,类型为 .frm 类型,该文件只存储表结构,而其数据文件都是存储在内存中的。这样有利于数据的快速处理,提高整个表的处理效率)
- 应用场景:
- 目标数据较小且非常频繁的访问,由于是在内存中存放数据,所以数据太大可能会造成内存溢出。
- 如果数据是临时的,且必须立即可用,那么就可以放在内存中。
- 存储在 Memory 表中的尽量是丢失了也没太大关系的数据。