通过本文我们将探索以下几个问题。
一、思考
- 问题一:存储引擎的作用
- 问题二:MYSQL支持哪几种存储引擎
- 问题三:各个存储引擎有哪些区别?
- 问题四:存储引擎是针对库还是表?如何设置?
二、分析
-
存储引擎定义
在上文【MYSQL---执行流程】中我们了解到执行器最终会调用存储引擎的接口进行数据操作。而我们能想到数据是存储在磁盘上的。那么我们是否可以理解为存储引擎的作用便是“查询或者维护磁盘数据并返回操作结果”。下文是从网络上搜集的存储引擎定义,供大家参考:
参考地址:https://github.com/jaywcjlove/mysql-tutorial/blob/master/chapter3/3.5.md
MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。 存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。
例如,如果你在研究大量的临时数据,你也许需要使用内存存储引擎。内存存储引擎能够在内存中存储所有的表格数据。又或者,你也许需要一个支持事务处理的数据库(以确保事务处理不成功时数据的回退能力)。
参考地址:https://segmentfault.com/a/1190000012588602
数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以 获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。MySql的核心就是插件式存储引擎。
-
常见MYSQL存储引擎
对于上图中的列名解释请看:https://dev.mysql.com/doc/refman/8.0/en/show-engines.html。其中XA代表是否支持分布式事务,SavePoints属于事务控制部分,支持回滚部分指定事务,支持事务的存储引擎才支持Savepoints。
从上图可以看出MySql支持的存储引擎表较多,接下来我们主要分析常见存储引擎以及其区别(InnoDB,MyISAM,MEMORY):
InnoDB
InnoDB作为MYSQL默认存储引擎,是一个健壮的事务型存储引擎。其主要有以下特性:
- 对于更新密集的表效率很高。适合处理多重并发的更新请求。
- 支持事务。
- 支持自动灾难恢复。
- 支持外键约束(预防破坏表之间连接的动作,也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一)。
- 支持自动增加列AUTO_INCREMENT属性。
如果需要支持事务,且存在大量并发读写的情况下,InnoDB存储引擎是首选。
MyISAM
MyISAM表是独立于操作系统的,这说明可以轻松地将其从Windows服务器移植到Linux服务器;每当我们建立一个MyISAM引擎的表时,就会在本地磁盘上建立三个文件,文件名就是表名,分别是:
- 表名.frm,存储表定义。
- 表名.MYD,存储数据。
- 表名.MYI,存储索引。
MyISAM存储引擎主要有以下特性:
- 具有较高的插入,查询速度。适合选择密集型和插入密集型的表。
- 每个MyISAM表最大索引数是64,这可以通过重新编译来改变。每个索引最大的列数是16。
- 最大的键长度是1000字节,这也可以通过编译来改变,对于键长度超过250字节的情况,一个超过1024字节的键将被用上
- BLOB和TEXT列可以被索引。
- NULL被允许在索引的列中,这个值占每个键的0~1个字节。
- 可以把数据文件和索引文件放在不同目录
因为MyISAM的并发插入选择能力,其很适合管理邮件或者Web服务器日志数据。
MEMORY
使用MySQL Memory存储引擎的出发点是速度。为得到最快的响应时间,采用的逻辑存储介质是系统内存。虽然在内存中存储表数据确实会提供很高的性能,但当mysqld守护进程崩溃时,所有的Memory数据都会丢失。获得速度的同时也带来了一些缺陷。它要求存储在Memory数据表里的数据使用的是长度不变的格式,这意味着不能使用BLOB和TEXT这样的长度可变的数据类型,VARCHAR是一种长度可变的类型,但因为它在MySQL内部当做长度固定不变的CHAR类型,所以可以使用。
一般在以下几种情况下使用Memory存储引擎:
- 目标数据较小,而且被非常频繁地访问。在内存中存放数据,所以会造成内存的使用,可以通过参数max_heap_table_size控制Memory表的大小,设置此参数,就可以限制Memory表的最大大小。
- 如果数据是临时的,而且要求必须立即可用,那么就可以存放在内存表中。
- 存储在Memory表中的数据如果突然丢失,不会对应用服务产生实质的负面影响。
- Memory同时支持散列索引和B树索引。B树索引的优于散列索引的是,可以使用部分查询和通配查询,也可以使用<、>和>=等操作符方便数据挖掘。散列索引进行“相等比较”非常快,但是对“范围比较”的速度就慢多了,因此散列索引值适合使用在=和<>的操作符中,不适合在<或>操作符中,也同样不适合用在order by子句中。
常用存储引擎比较
| 特性 | InnoDB | MyISAM | MEMORY | ARCHIVE |
|---|---|---|---|---|
| 存储限制(Storage limits) | 64TB | No | YES | No |
| 支持事物(Transactions) | Yes | No | No | No |
| 锁机制(Locking granularity) | 行锁 | 表锁 | 表锁 | 行锁 |
| B树索引(B-tree indexes) | Yes | Yes | Yes | No |
| T树索引(T-tree indexes) | No | No | No | No |
| 哈希索引(Hash indexes) | Yes | No | Yes | No |
| 全文索引(Full-text indexes) | Yes | Yes | No | No |
| 集群索引(Clustered indexes) | Yes | No | No | No |
| 数据缓存(Data caches) | Yes | No | N/A | No |
| 索引缓存(Index caches) | Yes | Yes | N/A | No |
| 数据可压缩(Compressed data) | Yes | Yes | No | Yes |
| 加密传输(Encrypted data[1]) | Yes | Yes | Yes | Yes |
| 集群数据库支持(Cluster databases support) | No | No | No | No |
| 复制支持(Replication support[2]) | Yes | No | No | Yes |
| 外键支持(Foreign key support) | Yes | No | No | No |
| 存储空间消耗(Storage Cost) | 高 | 低 | N/A | 非常低 |
| 内存消耗(Memory Cost) | 高 | 低 | N/A | 低 |
| 数据字典更新(Update statistics for data dictionary) | Yes | Yes | Yes | Yes |
| 备份/时间点恢复(backup/point-in-time recovery[3]) | Yes | Yes | Yes | Yes |
| 多版本并发控制(Multi-Version Concurrency Control/MVCC) | Yes | No | No | No |
| 批量数据写入效率(Bulk insert speed) | 慢 | 快 | 快 | 非常快 |
| 地理信息数据类型(Geospatial datatype support) | Yes | Yes | No | Yes |
| 地理信息索引(Geospatial indexing support[4]) | Yes | Yes | No | Yes |
-
存储引擎设置
同一个数据库中针对不同的表可以采用不同的存储引擎,而所有表的默认存储引擎为InnoDB。
1.默认存储引擎
由参数:default_storage_engine控制
2.建表时为当前表单独设置引擎
-
存储引擎选择
不同的存储引擎有不同的特性,一个库中的不同表可以选择不同的存储引擎满足不同的需求。通常从以下几个点出发选择合适的存储引擎:
- 是否需要支持事务。
- 是否支持外键约束。
- 是否允许崩溃(MEMORY崩溃会丢失数据)。
- 数据的操作频率,更新,插入,查询等,以及并发情况。
- 存储限制。
- 是否要支持行级锁。
本文到此为止。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
文中打了参考了以下两篇博文,大家可以参考进行深入了解:
参考博文:
- https://github.com/jaywcjlove/mysql-tutorial/blob/master/chapter3/3.5.md
- https://segmentfault.com/a/1190000012588602