面试官问我Mysql的存储引擎了解多少


Posted in MySQL onAugust 05, 2022

文章部分来源于黑马Mysql视频教程当中!

一、MySQL体系结构

如下图,Mysql总共分为了四层:

面试官问我Mysql的存储引擎了解多少

  • 连接层: 最上层是一些客户端和链接服务,主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。
  • 服务层: 第二层架构主要完成大多数的核心服务功能,如SQL接口,并完成缓存的查询,SQL的分析和优化,部分内置函数的执行。所有跨存储引擎的功能也在这一层实现,如过程、函数等。
  • 引擎层: 存储引擎真正的负责了MySQL中数据的存储和提取,服务器通过API和存储引擎进行通信。不同的存储引擎具有不同的功能,这样我们可以根据自己的需要,来选取合适的存储引擎。
  • 存储层: 主要是将数据存储在文件系统之上,并完成与存储引擎的交互。

二、存储引擎简介

引擎就是发动机,引擎就是一个机器的核心部分,不同的引擎有着不同的应用场景,例如飞机有飞机的引擎,火箭有火箭的引擎,他们之间是没有好坏之分的,我们只需要在合适的场景使用合适的引擎就可以了。

Mysql 存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的,所以存储引擎也可被称为表类型。

三、存储引擎的使用

(1)创建表的时候可以 通过ENGINE来指定存储引擎:

面试官问我Mysql的存储引擎了解多少

(2)查看当前数据库支持的存储引擎:

面试官问我Mysql的存储引擎了解多少

创建表的时候假如不指定引擎,默认就是InnoDB,在mysql早期的时候默认存储引擎是MyISAM。其中comment列就是官方对当前存储引擎的特性描述!

面试官问我Mysql的存储引擎了解多少

(3)查看某张表使用的存储引擎

如下sql可以查看当前表结构:

show create table 表名;

面试官问我Mysql的存储引擎了解多少

  • ENGINE:代表的是当前表的存储引擎
  • AUTO_INCREMENT:代表的是自增id目前已经增到多少了
  • CHARESET:代表的是字符集
  • COLLATE:代表的是排序规则

四、存储引擎特点

这里重点解释三个存储引擎,同时也是面试当中经常会问的!

1、InnoDB

InnoDB是一种兼顾高可靠性和高性能的通用存储引擎,在MySQL5.5之后,InnoDB是默认的MySQL存储引擎。

(1)特点:

  • DML操作遵循ACID模型,支持事务;
  • 行级锁,提高并发访问性能;
  • 支持外键FOREIGN KEY约束,保证数据的完整性和正确性

(2)不管是哪个引擎,数据肯定都是存储在硬盘的,我们可以通过以下命令查看存储位置:

SHOW VARIABLES LIKE 'datadir';

面试官问我Mysql的存储引擎了解多少

根据查询的位置打开,然后会发现每个数据库就是一个文件夹

面试官问我Mysql的存储引擎了解多少

然后任意打开一个库进去会发现都是frm文件!

frm文件是用来保存每个数据表的元数据信息,包括表结构的定义等。根本没有找到对应的数据文件,这是为什么呢,继续往下看!

面试官问我Mysql的存储引擎了解多少

(3)存储文件:

正常innodb引擎存储表的时候会有两个文件,一个是frm文件,一个是ibd文件。

Xxx.ibd: xxx代表的是表名, innoDB引擎的每张表都会对应这样一个表空间文件,存储该表的数据和索引。

可是我们在上面并没有看到ibd文件,这是因为mysql将存储方式分为了两种:

共享表空间:所谓共享表空间,就是所有数据库的表数据都存在了一个地方独立表空间:每个表都对应了一个ibd文件,存储数据

可以通过innodb_file_per_table参数来开启独立表空间,mysql8.0默认是打开了独立表空间,其余貌似默认都是关闭的。

innodb_file_per_table 的简要说明:

在很久很久以前也就是说还没有innodb_file_per_table 的那个年代,所有的innodb表的数据都是保存在共享表空间,在有了innodb_file_per_table参数后innodb可以把每个表的数据单独保存。单独保存有两方面的优势一个是方便管理,二个是提长性能。

show global variables like 'innodb_file_per_table';  -- 查看
set @@global.innodb_file_per_table=off;      -- 关闭
set @@global.innodb_file_per_table=on;       -- 打开innodb_file_per_table

innodb_file_per_table参数,mysql8.0默认是打开的,如果打开就代表的是每一张表对应了一个表空间。我的mysql是5.5版本的,所以根本没有开启,没有开启着意味着所有数据共用了一个表空间(也可以称为数据文件)。

(4)共享表空间文件上哪找?

默认配置下有一个初识大小为10M,名为ibdata1的文件,默认的表空间文件(tablespace file)。通过参数innodb_data_file_path可以设置文件

show global variables like 'innodb_data_file_path'; #查看表空间文件设置

面试官问我Mysql的存储引擎了解多少

解释ibdata1:10M:autpextend:代表的是表空间文件名为ibdata1,然后初始大小为10M,文件可以自动增长(autoextend)。

(5)通过以上命令我们知道表空间文件名称为ibdata1,那么他存储在什么地方?

他存储在我们安装mysql的时候指定的安装目录下,如果忘记安装目录了,可以通过全局搜文件名称,来寻找文件!

整个mysql所有库的数据都存放在下面文件当中!

面试官问我Mysql的存储引擎了解多少

(6)可以修改共享表空间设置:

表示将/db/ibdata1和/dr2/db/ibdata2两个文件来组成表空间,其中ibadata1的大小为2000M,文件ibdata2的大小为2000MB,如果用完了这2000MB,该文件可以自动增长(autoextend)。

innodb_data_file_path=/db/ibdata1:2000M;/dr2/db/ibdata2:2000M:autoextend

(7)将innodb_file_per_table打开

set @@global.innodb_file_per_table=on;       -- 打开

打开后他不会将历史的表已经共享的给单独独立起来,而是指的以后在新建表的时候,那么新建的表就是单独的表空间。

打开后新建了一个test表:

面试官问我Mysql的存储引擎了解多少

通过MySQL的 ibd2sdi 工具可以解析ibd文件,可以解析成json数据。

(8)innodb存储结构:

说是innodb存储结构,不如说是ibd文件的存储结构!

  • 一个表空间可以包含多个段
  • 一个段当中又可以包含多个区
  • 一个区当中包含多个页,页包含了索引页和数据页,一个区固定的是1M,一个page页大小是16k,一个区当中可以包含64个页
  • 一个页当中又包含了多个行,一个row行当中包含了最后一次事务id、指针、最后就是一个一个的字段了

page页是innodb存储结构当中最小的单元

面试官问我Mysql的存储引擎了解多少

具体了解存储结构的话内容有很多,后续写一篇专门分析存储结构的文章!

2、MyISAM

MyISAM是MySQL早期的默认存储引擎。这也就是经常面试问Innodb和MyISAM区别的原因!

(1)特点:

  • 不支持事务
  • 不支持外键
  • 支持表锁,不支持行锁访问速度快

(2)存储文件:

一个表对应了三个文件,而innodb对应了两个文件!

面试官问我Mysql的存储引擎了解多少

3、MEMORY

MEMORY引擎的表数据是存储在内存中的,由于受到硬件问题、或断电问题的影响,只能将这些表作为临时表或缓存使用。

(1)特点:

  • 内存存放
  • hash索引(默认)

(2)存储文件:

xxx.sdi:存储表结构信息

五、存储引擎选择

面试官问我Mysql的存储引擎了解多少

在选择存储引擎时,应该根据应用系统的特点选择合适的存储引擎。对于复杂的应用系统,还可以根据实际情况选择多种存储引擎进行组合。

  • InnoDB:是Mysql的默认存储引擎,支持事务、外键。如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包含很多的更新、删除操作,那么InnoDB存储引擎是比较合适的选择。
  • MyISAM:如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不是很高,那么选择这个存储引攀是非常合适的。
  • MEMORY:将所有数据保存在内存中,访问速度快,通常用于临时表及缓存。MEMORY的缺陷就是对表的大小有限制,太大的表无法缓存在内存中,而且无法保障数据的安全性。

在问你InnoDB和MyISAM的区别的时候,只需要围绕这三点来回答:事务、外键、行级锁

总结

到此这篇关于对存储引擎了解多少的文章就介绍到这了,更多相关Mysql存储引擎内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySql学习笔记之事务隔离级别详解
May 12 MySQL
Mysql Online DDL的使用详解
May 20 MySQL
MySQL 8.0 之不可见列的基本操作
May 20 MySQL
如何设计高效合理的MySQL查询语句
May 26 MySQL
MySQL中使用or、in与union all在查询命令下的效率对比
May 26 MySQL
QT连接MYSQL数据库的详细步骤
Jul 07 MySQL
一次MySQL启动导致的事故实战记录
Sep 15 MySQL
MYSQL 运算符总结
Nov 11 MySQL
MySQL Innodb索引机制详细介绍
Nov 23 MySQL
MySQL视图概念以及相关应用
Apr 19 MySQL
MySQL实现用逗号进行拼接、以逗号进行分割
Dec 24 MySQL
postgresql如何找到表中重复数据的行并删除
May 08 MySQL
MySQL索引失效场景及解决方案
Jul 23 #MySQL
MySQL添加索引特点及优化问题
Jul 23 #MySQL
MySQL表字段数量限制及行大小限制详情
Jul 23 #MySQL
MySQL分布式恢复进阶
Jul 23 #MySQL
jdbc中自带MySQL 连接池实践示例
Jul 23 #MySQL
MySQL池化框架学习接池自定义
Jul 23 #MySQL
mysql sock文件存储了什么信息
Jul 15 #MySQL
You might like
php用数组返回无限分类的列表数据的代码
2010/08/08 PHP
php模板原理讲解
2013/11/13 PHP
Yii把CGridView文本框换成下拉框的方法
2014/12/03 PHP
PHP实现检测客户端是否使用代理服务器及其匿名级别
2015/01/07 PHP
thinkPHP自动验证、自动添加及表单错误问题分析
2016/10/17 PHP
CI框架使用composer安装的依赖包步骤与方法分析
2016/11/21 PHP
关于js中alert弹出窗口文本换行问题简单详细说明
2012/12/11 Javascript
Extjs4.0设置Ext.data.Store传参的请求方式(默认为GET)
2013/04/02 Javascript
jquery如何把数组变为字符串传到服务端并处理
2014/04/30 Javascript
javascript中的正则表达式使用指南
2015/03/01 Javascript
javascript+html5实现绘制圆环的方法
2015/07/28 Javascript
JS判断元素是否在数组内的实现代码
2016/03/30 Javascript
使用 stylelint检查CSS_StyleLint
2016/04/28 Javascript
JS控制弹出悬浮窗口(一览画面)的实例代码
2016/05/30 Javascript
JavaScript中三种常见的排序方法
2017/02/24 Javascript
详解Vue中添加过渡效果
2017/03/20 Javascript
javascript计算对象长度的方法
2017/10/25 Javascript
JavaScript中EventLoop介绍
2018/01/22 Javascript
JavaScript设计模式之构造器模式(生成器模式)定义与用法实例分析
2018/07/26 Javascript
微信小程序加载机制及运行机制图解
2019/11/27 Javascript
Python遍历指定文件及文件夹的方法
2015/05/09 Python
Python中在for循环中嵌套使用if和else语句的技巧
2016/06/20 Python
Python实现获取命令行输出结果的方法
2017/06/10 Python
Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法
2018/03/13 Python
对Python 窗体(tkinter)文本编辑器(Text)详解
2018/10/11 Python
pandas中apply和transform方法的性能比较及区别介绍
2018/10/30 Python
pandas 空数据处理方法详解
2019/11/02 Python
Python vtk读取并显示dicom文件示例
2020/01/13 Python
Python字符串及文本模式方法详解
2020/09/10 Python
matplotlib部件之矩形选区(RectangleSelector)的实现
2021/02/01 Python
python解决OpenCV在读取显示图片的时候闪退的问题
2021/02/23 Python
CSS3实现图片抽屉式效果的示例代码
2019/11/06 HTML / CSS
黄山导游词
2015/01/31 职场文书
安全员岗位职责
2015/02/10 职场文书
预备党员群众意见
2015/06/01 职场文书
MySQL下使用Inplace和Online方式创建索引的教程
2021/05/26 MySQL