Mysql架构与内部模块-第三章
前言
接上文,本篇文章专门简述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架构与内部模块-第三章的更多相关文章
- Mysql架构与内部模块-第一章
Mysql作为大多数中小型企业的首选数据库,也可能是众多同僚接触的第一个数据库,其热门程度不言而喻,一些相对基础的知识本系列不做赘述,主要简述Mysql相关的进阶知识. 本章将由浅入深的讲解从连接My ...
- Mysql架构与内部模块-第二章
接上文,上文简述到了Mysql中的查询缓存和解析器,今日我们继续. 先来看一段SQL:SELECT * FROM `jianghuadong`; 先假设我们数据库中并没有一张名为jianghuadon ...
- Mysql必知必会 第三章 使用Mysql
第三章 使用Mysql SQL语句和大小写 请注意,SQL语句不区分大小写,因此SELECT与select是相同的.同样,写成Select也没有关系.许多SQL开发人员喜欢对所有SQL关键字使用大写, ...
- .net架构设计读书笔记--第三章 第9节 域模型实现(ImplementingDomain Model)
我们长时间争论什么方案是实现域业务领域层架构的最佳方法.最后,我们用一个在线商店案例来说明,其中忽略了许多之前遇到的一些场景.在线商店对很多人来说更容易理解. 一.在线商店项目简介 1. 用例 ...
- .net架构设计读书笔记--第三章 第8节 域模型简介(Introducing Domain Model)
一.数据--行为转变 很长的时间,典型的分析方法或多或少是以下两种,第一,收集需求并做一些分析,找出有关实体 (例如,客户. 订单. 产品) 和进程来实现. 第二,手持这种理解你尝试推断一个物 ...
- .net架构设计读书笔记--第三章 第10节 命令职责分离(CQRS)简介(Introducing CQRS)
一.分离查询命令 Separating commands from queries 早期的面向DDD设计方法的难点是如何设计一个类,这个类要包含域的方方面面.通常来说,任务软件系统方法调用可以 ...
- 打通MySQL架构和业务的任督二脉
目前,在很多OLTP场景中,MySQL数据库都有着广泛的应用,也有很多不同的使用方式.从数据库的业务需求.架构设计.运营维护.再到扩容迁移,不同的MySQL架构有不同的特点,适应一定的业务场景,或者解 ...
- 纲举目张:打通MySQL架构和业务的任督二脉
目前,在很多OLTP场景中,MySQL数据库都有着广泛的应用,也有很多不同的使用方式.从数据库的业务需求.架构设计.运营维护.再到扩容迁移,不同的MySQL架构有不同的特点,适应一定的业务场景,或者解 ...
- 第 2 章 MySQL 架构组成
麻雀虽小,五脏俱全.MySQL 虽然以简单著称,但其内部结构并不简单.本章从MySQL物理组成.逻辑组成,以及相关工具几个角度来介绍 MySQL 的整体架构组成,希望能够让读者对 MySQL 有一个更 ...
随机推荐
- LiteOS间歇计算技术:IOT终端真正感受“电量自由”
摘要:LiteOS间歇计算为什么能使物联网终端实现长续航? 物联网设备.场景复杂多样,小到智能穿戴的耳机,大到大型基建设备,更有我们陌生而又熟悉场景,例如深海探测.森林监控.野生动物跟踪等等能量采集场 ...
- 抽象工厂模式详解 —— head first 设计模式
项目实例 假设你有一家 pizza 店,你有很多种 pizza,要在系统中显示你所有 pizza 种类.实现这个功能并不难,使用普通方式实现: public class PizzaStore { Pi ...
- Linux驱动之设备树的基础知识
前期知识 1. 如何编写一个简单的Linux驱动(一)--驱动的基本框架 2. 如何编写一个简单的Linux驱动(二)--设备操作集file_operations 3. 如何编写一个简单的 ...
- Unit4:碎片
基本使用 动态调用 碎片和活动 碎片周期
- [LeetCode] 79. 单词搜索(DFS,回溯)
题目 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单元格 ...
- MySQL行构造器
子查询返回多列的办法 主要用途,项目中初版使用子查询返回一列用来限制主表,项目新版本中,表关联建改为多列时建议使用
- Mysql数据分片技术(一)——初识表分区
1. 为什么需要数据分片技术 2. 3种数据分片方式简述 3. 分片技术原理概述 4. 对单表分区的时机 1为什么需要数据分片技术 数据库产品的市场 在互联网行业内,绝大部分开发人员都会遇到数据表的性 ...
- python文档翻译之概述
Python是一个使用方便且功能强大的变成语言.它具有高效的高级数据结构和面向对象编程特性.其优雅的语法.动态类型.解释型特性使得它成为大多数平台上脚本和快速应用程序开发的理想语言. Python解释 ...
- 我搭建了一套企业级私有Git服务,抗住了每天上万次攻击!
写在前面 事情是这样的,今年疫情期间,我在某云购买了一套服务器,做什么呢?不是用来部署项目,也不是用来搭建网站,而是用来做代码备份和管理.没错,都是我个人的代码,也许你会说,你个人能有多少代码啊?确实 ...
- Python安装与环境变量配置 入门详解 - 精简归纳
Python安装与环境变量配置 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 9 / 24 转载请注明出处!️ 目录 Python安装与环境变量配置 入门详解 - 精简归纳 一.下载Py ...