通过本文我们将探索以下几个问题。

一、思考

  • 问题一:存储引擎的作用
  • 问题二:MYSQL支持哪几种存储引擎
  • 问题三:各个存储引擎有哪些区别?
  • 问题四:存储引擎是针对库还是表?如何设置?

二、分析

  • 存储引擎定义

在上文【MYSQL---执行流程】中我们了解到执行器最终会调用存储引擎的接口进行数据操作。而我们能想到数据是存储在磁盘上的。那么我们是否可以理解为存储引擎的作用便是“查询或者维护磁盘数据并返回操作结果”。下文是从网络上搜集的存储引擎定义,供大家参考:

参考地址:https://github.com/jaywcjlove/mysql-tutorial/blob/master/chapter3/3.5.md

MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。 存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。

例如,如果你在研究大量的临时数据,你也许需要使用内存存储引擎。内存存储引擎能够在内存中存储所有的表格数据。又或者,你也许需要一个支持事务处理的数据库(以确保事务处理不成功时数据的回退能力)。

参考地址:https://segmentfault.com/a/1190000012588602

数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以 获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。MySql的核心就是插件式存储引擎。

  • 常见MYSQL存储引擎

MYSQL---存储引擎

对于上图中的列名解释请看:https://dev.mysql.com/doc/refman/8.0/en/show-engines.html。其中XA代表是否支持分布式事务,SavePoints属于事务控制部分,支持回滚部分指定事务,支持事务的存储引擎才支持Savepoints。

从上图可以看出MySql支持的存储引擎表较多,接下来我们主要分析常见存储引擎以及其区别(InnoDB,MyISAM,MEMORY):

InnoDB

InnoDB作为MYSQL默认存储引擎,是一个健壮的事务型存储引擎。其主要有以下特性:

  1. 对于更新密集的表效率很高。适合处理多重并发的更新请求。
  2. 支持事务。
  3. 支持自动灾难恢复。
  4. 支持外键约束(预防破坏表之间连接的动作,也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一)。
  5. 支持自动增加列AUTO_INCREMENT属性。

如果需要支持事务,且存在大量并发读写的情况下,InnoDB存储引擎是首选。

MyISAM

MyISAM表是独立于操作系统的,这说明可以轻松地将其从Windows服务器移植到Linux服务器;每当我们建立一个MyISAM引擎的表时,就会在本地磁盘上建立三个文件,文件名就是表名,分别是:

  • 表名.frm,存储表定义。
  • 表名.MYD,存储数据。
  • 表名.MYI,存储索引。

MyISAM存储引擎主要有以下特性:

  1. 具有较高的插入,查询速度。适合选择密集型和插入密集型的表。
  2. 每个MyISAM表最大索引数是64,这可以通过重新编译来改变。每个索引最大的列数是16。
  3. 最大的键长度是1000字节,这也可以通过编译来改变,对于键长度超过250字节的情况,一个超过1024字节的键将被用上
  4. BLOB和TEXT列可以被索引。
  5. NULL被允许在索引的列中,这个值占每个键的0~1个字节。
  6. 可以把数据文件和索引文件放在不同目录

因为MyISAM的并发插入选择能力,其很适合管理邮件或者Web服务器日志数据。

MEMORY

使用MySQL Memory存储引擎的出发点是速度。为得到最快的响应时间,采用的逻辑存储介质是系统内存。虽然在内存中存储表数据确实会提供很高的性能,但当mysqld守护进程崩溃时,所有的Memory数据都会丢失。获得速度的同时也带来了一些缺陷。它要求存储在Memory数据表里的数据使用的是长度不变的格式,这意味着不能使用BLOB和TEXT这样的长度可变的数据类型,VARCHAR是一种长度可变的类型,但因为它在MySQL内部当做长度固定不变的CHAR类型,所以可以使用。

一般在以下几种情况下使用Memory存储引擎:

  1. 目标数据较小,而且被非常频繁地访问。在内存中存放数据,所以会造成内存的使用,可以通过参数max_heap_table_size控制Memory表的大小,设置此参数,就可以限制Memory表的最大大小。
  2. 如果数据是临时的,而且要求必须立即可用,那么就可以存放在内存表中。
  3. 存储在Memory表中的数据如果突然丢失,不会对应用服务产生实质的负面影响。
  4. 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.建表时为当前表单独设置引擎

MYSQL---存储引擎

  • 存储引擎选择

不同的存储引擎有不同的特性,一个库中的不同表可以选择不同的存储引擎满足不同的需求。通常从以下几个点出发选择合适的存储引擎:

  1. 是否需要支持事务。
  2. 是否支持外键约束。
  3. 是否允许崩溃(MEMORY崩溃会丢失数据)。
  4. 数据的操作频率,更新,插入,查询等,以及并发情况。
  5. 存储限制。
  6. 是否要支持行级锁。

本文到此为止。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

文中打了参考了以下两篇博文,大家可以参考进行深入了解:

参考博文:

  1. https://github.com/jaywcjlove/mysql-tutorial/blob/master/chapter3/3.5.md
  2. https://segmentfault.com/a/1190000012588602

 

相关文章: