存储引擎概述
存储引擎其实就是如何实现存储数据,如何为存储的数据建立索引以及如何更新,查询数据等技术实现的方法。
MySQL中的数据用各种不同的技术存储在文件(或内存)中,这些技术中的每一种技术都使用不同的存储机制,索引技巧,锁定水平并且最终提供广泛的不同功能和能力。在MySQL中将这些不同的技术及配套的相关功能称为存储引擎。
存储引擎对比
特点 | MyISAM | InnoDB | MEMORY | MERGE | NDB |
存储限制 | 256TB | 64TB | RAM | - | 有 |
事务安全 | - | 支持 | - | - | - |
锁机制 | 表锁 | 行锁 | 表锁 | 表锁 | 行锁 |
B树索引 | 支持 | 支持 | 支持 | 支持 | 支持 |
哈希索引 | - | - | 支持 | - | 支持 |
全文索引 | 支持 | - | - | - | - |
集群索引 | - | 支持 | - | - | - |
数据缓存 | - | 支持 | 支持 | - | 支持 |
索引缓存 | 支持 | 支持 | 支持 | 支持 | 支持 |
数据可压缩 | 支持 | - | - | - | - |
空间可用 | 低 | 高 | N/A | 低 | 低 |
内存使用 | 低 | 高 | 中 | 低 | 高 |
批量插入速度 | 高 | 低 | 高 | 高 | 高 |
支持外键 | - | 支持 | - | - | - |
MyISAM存储引擎
- 数据存储方式简单,使用 B+Tree 进行索引
- 使用三个文件定义一个表:.MYI .MYD .frm
- 少碎片、支持大文件、能够进行索引压缩
- 二进制层次的文件可以移植
- 访问速度飞快,是所有MySQL文件引擎中速度最快的
- Table level lock,性能稍差,更适合读取多的操作
- 表数据容量有限,一般建议单表数据量介于 50w-200w
- 增删查改以后要使用 myisamchk 检查优化表
- 支持三种不同的存储结构:静态型、动态型、压缩型
InnoDB存储引擎
- 使用 Table Space 的方式来进行数据存储 (ibdata1, ib_logfile0)
- 支持事务、外键约束等数据库特性
- Rows level lock, 读写性能都非常优秀
- 能够承载大数据量的存储和访问
- 拥有自己独立的缓冲池,能够缓存数据和索引
- 在关闭自动提交的情况下,与MyISAM引擎速度差异不大(甚至更快)
MEMORY存储引擎
- 每个表可以有多达32个索引,每个索引16列,以及500字节的最大键长度
- 可以在一个表中有非唯一键值
- 使用一个固定的记录长度格式
- 不支持BLOB或TEXT列
- 支持AUTO_INCREMENT列和对可包含NULL值的列的索引
- 在所由客户端之间共享(就像其他任何非TEMPORARY表)
MERGE存储引擎
- 是一组MyISAM表的组合,这些MyISAM表必须结构完全相同
- 表本身并没有数据,对表的操作实际上是对内部的MyISAM表进行
- 使用两个文件:.frm 存储表定义、.MRG 包含组合表的信息
存储引擎选择
- MyISAM:如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不是很高,那么选择这个存储引擎是非常适合的。MyISAM是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。
- InnoDB:用于事务处理应用程序,支持外键。如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询以外,还包括很多更新、删除操作,那么InnoDB存储引擎应该是比较合适的选择。InnoDB存储引擎除了有效低降低由于删除和更新导致的锁定,还可以确保事务的完整提交(Commit)和回滚(Rollback),对于类似计费系统或者财务系统等对数据准确性要求比较高的系统,InnoDB都是合适的选择。
- MEMORY:将所有数据保存在RAM中,在需要快速定位记录和其他类似数据的环境下,可提供极快的访问。MEMORY的缺陷是对表的大小有限制,太大的表无法缓存在内存中,其次是要确保表的数据可以恢复 ,数据库异常终止后表中的数据是可以恢复的。MEMORY表通常用于更新不太频繁的小表,用以快速得到访问结果。
- MERGE:用于将一系列等同的MyISAM表以逻辑方式组合在一起,并作为一个对象引用它们。MERGE表的优点在于可以突破对单个MyISAM表大小的限制,并且通过将不同的表分布在多个磁盘上,可以有效地改善MERGE表的访问效率。这对于诸如数据仓储等VLDB环境十分适合。