1.InnoDB引擎:
InnoDB
是一种兼顾了高可靠性和高性能的通用存储引擎。在MySQL 5.7中,InnoDB
是默认的MySQL存储引擎。除非配置了其他默认存储引擎,否则发出CREATE TABLE不带ENGINE=
子句的语句将创建一个InnoDB
表。InnoDB表是基于聚簇索引建立的,其索引结构和MySQL的其他存储引擎有很大区别。内部做了很多优化,包括从磁盘读取数据时采用的可预测性预读。
InnoDB存储引擎的优势:(重要)
- 他的DML操作遵循ACID模型,并具有提交,回滚和奔溃恢复功能的事物,以保护用户数据;
- 行级锁和Oracle风格的一致性读取可提高多用户并发性和性能;
InnoDB
表格将您的数据排列在磁盘上以基于主键优化查询 。每个InnoDB
表都有一个称为聚集索引的主键索引,该索引数据结构以最小化主键查找的 I/O;- 维护数据完整性,
InnoDB
支持FOREIGN KEY约束。使用外键检查插入,更新和删除操作,以确保它们不会导致不同表之间的不一致;
特征 | 支持 |
---|---|
B树索引 | 是 |
备份/时间点恢复(在服务器中而不是在存储引擎中实现。) | 是 |
集群数据库支持 | 没有 |
聚集索引 | 是 |
压缩数据 | 是 |
资料快取 | 是 |
加密数据 | 是(通过加密功能在服务器中实现;在MySQL 5.7和更高版本中,支持静态数据表空间加密。) |
外键支持 | 是 |
全文搜索索引 | 是(MySQL 5.6和更高版本提供InnoDB对FULLTEXT索引的支持。) |
地理空间数据类型支持 | 是 |
地理空间索引支持 | 是(MySQL 5.7和更高版本提供InnoDB对地理空间索引的支持。) |
哈希索引 | 否(InnoDB在内部将哈希索引用于其自适应哈希索引功能。) |
索引缓存 | 是 |
锁定粒度 | 行 |
MVCC | 是 |
复制支持(在服务器中而不是在存储引擎中实现。) | 是 |
储存限制 | 64TB |
T树索引 | 没有 |
交易次数 | 是 |
更新数据字典的统计信息 | 是 |
2.MyISAM引擎:
在MySQL5.1版本之前,MyISAM是默认的存储引擎。MyISAM提供了大量的特性,包括全文检索、压缩、空间函数等, 但MyISAM不支持事务和行级锁,而有一个缺陷就是崩溃后无法安全恢复。虽然MyISAM有这样的缺陷,但并非一无是处。 对于只读的数据,或者表比较小,可以忍受修复操作,则依然可以继续使用MyISAM引擎;
MyISAM
基于较旧(且不再可用)的ISAM
存储引擎,但具有许多有用的扩展
MyISAM特性
- 加锁与并发:MyISAM对整张表加锁,而不是针对行。读取时会对需要读到的所有表加共享锁,写入则对表加排它锁。 在表有读取查询的同时,也可以往表中插入新的记录(被称为并发插入)。
- 修复:MySQL可以对MyISAM表进行手工或者自动检查和修复操作,但这里所说的修复和事务恢复以及崩溃修复是不同的概念。执行表的修复可能导致一些数据丢失,而且修复操作非常慢。可以通过CHECK TABLE tableName检查表的错误,如果有错误可以通过执行REPAIR TABLE tableName进行修复。
- 索引特性:对于MyISAM表,即使是BLOB和TEXT等长字段,也可以基于前500个字符创建索引。MyISAM也支持全文索引,这是一种基于分词创建的索引,可以支持复杂的查询。
- 延迟更新索引键:创建MyISAM表的时候,如果指定了DELAY_KEY_WRITE选项,在每次修改执行完成时,不会立刻 将修改的索引数据写入磁盘,而是会写到内存中的键缓冲区,只有在清理键缓冲区或者关闭表的时候才会将对应的索引块写 入到磁盘。可以极大的提升写入性能,但是数据库或者主机崩溃时会造成索引损坏,需要执行修复操作。
特征 | 支持 |
---|---|
B树索引 | 是 |
备份/时间点恢复(在服务器中而不是在存储引擎中实现。) | 是 |
集群数据库支持 | 没有 |
聚集索引 | 没有 |
压缩数据 | 是(仅在使用压缩行格式时才支持压缩MyISAM表。将压缩行格式与MyISAM一起使用的表是只读的。) |
资料快取 | 没有 |
加密数据 | 是(通过加密功能在服务器中实现。) |
外键支持 | 没有 |
全文搜索索引 | 是 |
地理空间数据类型支持 | 是 |
地理空间索引支持 | 是 |
哈希索引 | 没有 |
索引缓存 | 是 |
锁定粒度 | 表 |
MVCC | 没有 |
复制支持(在服务器中而不是在存储引擎中实现。) | 是 |
储存限制 | 256TB |
T树索引 | 没有 |
交易次数 | 没有 |
更新数据字典的统计信息 | 是 |
3.Memory引擎
MEMORY存储引擎(以前称为 HEAP)创建具有存储在存储器中的内容的专用的表。由于数据容易受到崩溃,硬件问题或电源中断的影响,因此只能将这些表用作临时工作区或只读缓存,以存储从其他表中提取的数据;
应用场景:
- 涉及瞬态,非关键数据的操作,例如会话管理或缓存。当MySQL服务器停止或重新启动时,MEMORY表中的数据将丢失。
- 内存中存储可实现快速访问和低延迟。数据量可以完全容纳在内存中,而不会导致操作系统换出虚拟内存页面。
- 只读或只读的数据访问模式(有限的更新)。
- NDB群集提供MEMORY与具有更高性能级别的引擎相同的功能 ,并提供以下功能不可用的其他功能 MEMORY: 行级锁定和多线程操作可减少客户端之间的争用。
- 即使包含写的语句混合也具有可伸缩性。
- 可选的磁盘支持操作,可确保数据持久性。 无共享架构和多主机操作,没有单点故障,可实现99.999%的可用性。
- 跨节点自动数据分发;应用程序开发人员无需制定自定义分片或分区解决方案。
- 不支持可变长度数据类型(包括 BLOB和 TEXT) MEMORY。
修改表的存储引擎
1.ALTER TABLE tableName ENGINE = InnoDB