前言

接上文,本篇文章专门简述Mysql存储引擎,内容繁多,如果你只需知道每种存储引擎的适用场景,可以直接查看本文最后列出的适用场景部分。

正文:

Mysql存储引擎作为本系列文章中相对重要的一环,也是相关领域面试官问的比较多的一部分,能够掌握不同的存储引擎的区别,可以让你在工作中有更加突出的表现。

存储引擎首先其实它是一个进程,它能够决定你的数据的存储方式,管理方式,然后提供一些特性。

先带着一个问题进入后面的内容:Mysql为什么要设计如此多的存储引擎?

Mysql存储引擎是一种数据分布格式,从最直观的角度来讲,就是表文件在磁盘上的表现形式不同,文件个数不同,举个例子:

我们新建一张表:member_a,存储引擎选用InnoDB.

然后我们查看member_a表在我们磁盘上的表现:

包含两个文件:member_a.frm以及member_a.ibd ,其中frm文件为表元数据文件,比如表结构等相关信息,那么也就是说,不管你采用什么存储引擎

xxx.frm文件都是必要存在的,因为只要你是一张表,那么在你的磁盘上就会存在tableName.frm。

可以在你数据库发生意外损坏时使用此文件进行恢复,恢复方法我在后续有时间的话也会另开一篇文章进行详细说明各种存储类型的恢复。

ibd文件是存放InnoDB数据的文件,当然也包括索引,除此之外还可能存在一个后缀为.ibdata的文件,此文件和ibd文件相同,那么为什么InnoDB会存在两个不同类型的文件进行数据存储?

实际上InnoDB具有两种存储方式:共享表空间存储(ibdata),独立表空间存储(ibd) ,其可以通过配置来决定。

独立表空间(ibd)为一张表一个xx.ibd文件。

共享表空间(ibdata)可以设置为所有表共享一个或者多个ibdata文件。

共享表空间的相关设置,本文就不做赘述,感兴趣的朋友可以查阅相关资料。

然后我们再使用MyISAM存储引擎创建表:member_b,然后观察此表在磁盘上的结构:

可以看到,除了必须存在的member_b.frm文件外,少了InnoDB引擎专有的xxx.ibd文件,多了MYD和MYI文件。

请注意这两个文件是MyISAM引擎的特有文件,MYD存放表数据,MYI文件存放索引等信息。

然后我们在新增一张使用MEMORY存储引擎的表:member_c:

可以看到,数据目录下,member_c表只存在一个文件:member_c.frm。

以上举例了3种比较常见的Mysql存储引擎,在Mysql5.7以上的版本中,在创建表时,如果不指定表的存储引擎,那么默认为InnoDB引擎,下面将列出Mysql5.7全部的

存储引擎列表及详细说明

Mysql的存储引擎分为以下种类:

InnoDB存储引擎(5.7以上默认引擎)

MyISAM存储引擎

MEMORY存储引擎

CSV存储引擎

ARCHIVE存储引擎

BLACKHOLE存储引擎

MERGE存储引擎

FEDERATED存储引擎

EXAMPLE存储引擎

第三方存储引擎(社区或者如果你对C语言非常熟悉,你可以根据Mysql提供的接口规范,自己写上一个存储引擎,那你是非常牛逼的,从这个地方其实也可以看出来,为什么

我们的表在创建的时候指定了存储引擎,在后续还能够修改为不同的存储引擎,因为这些存储引擎都实现了同一套接口,跟JAVA为什么能够支持这么多数据库一样的道理,

因为都实现了JDK提供的接口。)

以上例举了Mysql目前支持的存储引擎,可以看到种类繁多,他们的运用场景也大不相同,下面我们聊聊每种存储引擎的不同:

InnoDB存储引擎

InnoDB是一款高性能和高可用兼并的通用存储引擎,在Mysql5.7以上,如果你在创建表时,不指定ENGINE为其他引擎,那么默认将创建一个InnoDB引擎的表,

InnoDB表的DML操作遵循ACID模型,并且支持事物(提交,回滚,崩溃恢复),以保证用户的数据安全,支持行级锁定和Oracle风格的一致读取,保证了多用户并发和性能。

InnoDB表会将你的数据安排在磁盘上,并基于主键优化查询,每个InnoDB表都有一个称之为 聚集索引 的主键索引,这个索引将组织数据以最小化主键查找的I/O.

InnoDB支持MVCC,其实就是一致性非锁定读的技术,这个内容我们后续有时间会聊聊。

InnoDB支持外键。

InnoDB存储引擎适用场景总结:适用于需要经常修改和插入,对并发和QPS要求较高,且对数据一致性要求较高的表。

以下是InnoDB在5.7版本中支持的功能:

特征 支持
B树索引
备份/时间点恢复(在服务器中而不是在存储引擎中实现。)
集群数据库支持 没有
聚集索引
压缩数据
资料快取
加密数据 是(通过加密功能在服务器中实现;在MySQL 5.7和更高版本中,支持静态数据表空间加密。)
外键支持
全文搜索索引 是(MySQL 5.6和更高版本提供InnoDB对FULLTEXT索引的支持。)
地理空间数据类型支持
地理空间索引支持 是(MySQL 5.7和更高版本提供InnoDB对地理空间索引的支持。)
哈希索引 否(InnoDB在内部将哈希索引用于其自适应哈希索引功能。)
索引缓存
锁定粒度
MVCC
复制支持(在服务器中而不是在存储引擎中实现。)
储存限制 64TB
T树索引 没有
交易次数
更新数据字典的统计信息
 

MyISAM存储引擎

MyISAM引擎是基于老旧的ISAM存储引擎优化后的成果,使用MyISAM存储引擎的表具有以下特点:

所有的数据值都是以低字节存储,此特征可能不太适用于一些特殊的嵌入式系统。

所有的数字键值都先存储高字节,这要可以实现更好的索引压缩。

支持大文件。

MyISAM存储引擎的表,最大的索引数量为64,一个索引最多能够关联16列。

支持并发插入。

支持把数据文件和索引文件放在不同的物理机中。

不支持事务。

不支持外键。

MyISAM存储引擎试用场景总结:适用于大量读写,不需要外键约束,不需要事务的表。

以下是InnoDB在5.7版本中支持的功能:

特征 支持
B树索引
备份/时间点恢复(在服务器中而不是在存储引擎中实现。)
集群数据库支持 没有
聚集索引 没有
压缩数据 是(仅当使用压缩行格式时才支持压缩MyISAM表。将压缩行格式与MyISAM一起使用的表是只读的。)
资料快取 没有
加密数据 是(通过加密功能在服务器中实现。)
外键支持 没有
全文搜索索引
地理空间数据类型支持
地理空间索引支持
哈希索引 没有
索引缓存
锁定粒度
MVCC 没有
复制支持(在服务器中而不是在存储引擎中实现。)
储存限制 256TB
T树索引 没有
交易次数 没有
更新数据字典的统计信息

因篇幅问题,今日暂时先介绍两种存储引擎,明日将带来后续几种存储引擎的介绍。

FEDERATED

Mysql架构与内部模块-第三章的更多相关文章

  1. Mysql架构与内部模块-第一章

    Mysql作为大多数中小型企业的首选数据库,也可能是众多同僚接触的第一个数据库,其热门程度不言而喻,一些相对基础的知识本系列不做赘述,主要简述Mysql相关的进阶知识. 本章将由浅入深的讲解从连接My ...

  2. Mysql架构与内部模块-第二章

    接上文,上文简述到了Mysql中的查询缓存和解析器,今日我们继续. 先来看一段SQL:SELECT * FROM `jianghuadong`; 先假设我们数据库中并没有一张名为jianghuadon ...

  3. Mysql必知必会 第三章 使用Mysql

    第三章 使用Mysql SQL语句和大小写 请注意,SQL语句不区分大小写,因此SELECT与select是相同的.同样,写成Select也没有关系.许多SQL开发人员喜欢对所有SQL关键字使用大写, ...

  4. .net架构设计读书笔记--第三章 第9节 域模型实现(ImplementingDomain Model)

        我们长时间争论什么方案是实现域业务领域层架构的最佳方法.最后,我们用一个在线商店案例来说明,其中忽略了许多之前遇到的一些场景.在线商店对很多人来说更容易理解. 一.在线商店项目简介 1. 用例 ...

  5. .net架构设计读书笔记--第三章 第8节 域模型简介(Introducing Domain Model)

    一.数据--行为转变     很长的时间,典型的分析方法或多或少是以下两种,第一,收集需求并做一些分析,找出有关实体 (例如,客户. 订单. 产品) 和进程来实现. 第二,手持这种理解你尝试推断一个物 ...

  6. .net架构设计读书笔记--第三章 第10节 命令职责分离(CQRS)简介(Introducing CQRS)

    一.分离查询命令 Separating commands from queries     早期的面向DDD设计方法的难点是如何设计一个类,这个类要包含域的方方面面.通常来说,任务软件系统方法调用可以 ...

  7. 打通MySQL架构和业务的任督二脉

    目前,在很多OLTP场景中,MySQL数据库都有着广泛的应用,也有很多不同的使用方式.从数据库的业务需求.架构设计.运营维护.再到扩容迁移,不同的MySQL架构有不同的特点,适应一定的业务场景,或者解 ...

  8. 纲举目张:打通MySQL架构和业务的任督二脉

    目前,在很多OLTP场景中,MySQL数据库都有着广泛的应用,也有很多不同的使用方式.从数据库的业务需求.架构设计.运营维护.再到扩容迁移,不同的MySQL架构有不同的特点,适应一定的业务场景,或者解 ...

  9. 第 2 章 MySQL 架构组成

    麻雀虽小,五脏俱全.MySQL 虽然以简单著称,但其内部结构并不简单.本章从MySQL物理组成.逻辑组成,以及相关工具几个角度来介绍 MySQL 的整体架构组成,希望能够让读者对 MySQL 有一个更 ...

随机推荐

  1. VFS

    VFS的作用:为文件系统提供通用的接口. 通用文件模型:common file model.特殊文件系统需要将它的物理结构转换成通用文件模型. common file model包括以下几个重要对象: ...

  2. C++二维数组动态内存分配

    对于二维数组和二维指针的内存的分配 这里首选说一下一维指针和一维数组的内存分配情况. 一维: 数组:形如int  a[5];这里定义了一个一维数组a,并且数组的元素个数是5,这里的a是这五个元素的整体 ...

  3. Codeforces Round #322 (Div. 2) B. Luxurious Houses 水题

    B. Luxurious Houses Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/581/pr ...

  4. JSP版(utf8编码)的Ueditor百度文章编辑器配置以及使用说明

    二话不说,先上图: 我配置好的效果大致是这些功能:基本的文字编辑功能.图片上传功能.附件上传功能.百度/谷歌地图搜索截图.视/音频发布功能.这个插件是现今我用过觉得最舒服的编辑器,功能齐全强大,稍微修 ...

  5. 控制台console使用MFC库函数,Cout输出CString的方法

    新建工程的时候选择:Win32 Console Application 在向导的地方勾选MFC头文件支持,确认即可 等待初始化文件完成后,VS2010会自动打开 项目名.cpp的文件 其中int _t ...

  6. 【Android Developers Training】 80. 管理网络使用

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  7. 用原型代替PRD时,原型应该包含哪些内容

    随着互联网节奏越来越快,传统的需求文档已经比较难适应市场的脚步,特别对于要求敏捷的团队来说,冗余而细致入微的需求文档已经成为包袱(这么长个文档领导也不会看呀).目前大多数团队更喜爱直接使用原型来代替需 ...

  8. POJ-2240 Arbitrage---判断正环+枚举

    题目链接: https://vjudge.net/problem/POJ-2240 题目大意: 已知n种货币,以及m种货币汇率及方式,问能否通过货币转换,使得财富增加. 思路: 由于这里问的是财富有没 ...

  9. Google图片加载库Glide的简单封装GlideUtils

    Google图片加载库Glide的简单封装GlideUtils 因为项目里用的Glide的地方比较多,所有简单的封装了以下,其实也没什么,就是写了个工具类,但是还是要把基础说下 Glide的Githu ...

  10. 内存管理 re模块

    # 内存垃圾回收机制: # 工作原理:引用计数 # 引用就+1 释放就是-1 当计数为0时 就会被垃圾回收机制回收 # 标记清除:解决循环引用导致的内存泄漏 # 标记:GC roots可以直接或间接访 ...