面试官问我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令人咋舌的隐式转换
Apr 05 MySQL
如何使用Maxwell实时同步mysql数据
Apr 08 MySQL
超详细教你怎么升级Mysql的版本
May 19 MySQL
MySQL大小写敏感的注意事项
May 24 MySQL
MySQL系列之十一 日志记录
Jul 02 MySQL
Mysql中where与on的区别及何时使用详析
Aug 04 MySQL
mysql配置SSL证书登录的实现
Sep 04 MySQL
Linux7.6二进制安装Mysql8.0.27详细操作步骤
Nov 27 MySQL
MySQL RC事务隔离的实现
Mar 31 MySQL
CentOS 7安装mysql5.7使用XtraBackUp备份工具命令详解
Apr 12 MySQL
MYSQL常用函数介绍
May 05 MySQL
MySQL中LAG()函数和LEAD()函数的使用
Aug 14 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 文件扩展名 获取函数
2009/06/03 PHP
一个基于PDO的数据库操作类
2011/03/24 PHP
php银联网页支付实现方法
2015/03/04 PHP
php示例详解Constructor Prototype Pattern 原型模式
2015/10/15 PHP
Yii2框架可逆加密简单实现方法
2017/08/25 PHP
PHP使用Redis长连接的方法详解
2018/02/12 PHP
php curl优化下载微信头像的方法总结
2018/09/07 PHP
Laravel框架实现的rbac权限管理操作示例
2019/01/16 PHP
JavaScript isPrototypeOf和hasOwnProperty使用区别
2010/03/04 Javascript
js/jquery解析json和数组格式的方法详解
2014/01/09 Javascript
js实现汉字排序的方法
2015/07/23 Javascript
通用javascript代码判断版本号是否在版本范围之间
2015/11/29 Javascript
js实现表单提交后不重新刷新当前页面
2016/11/30 Javascript
谈谈因Vue.js引发关于getter和setter的思考
2016/12/02 Javascript
Bootstrap table 定制提示语的加载过程
2017/02/20 Javascript
JavaScript实现图片拖曳效果
2017/09/08 Javascript
vue配置多页面的实现方法
2018/05/22 Javascript
vue动态改变背景图片demo分享
2018/09/13 Javascript
详解Vue.js在页面加载时执行某个方法
2018/11/20 Javascript
python 字符串split的用法分享
2013/03/23 Python
Python设计模式之工厂模式简单示例
2018/01/09 Python
python解析html提取数据,并生成word文档实例解析
2018/01/22 Python
Win10下python 2.7.13 安装配置方法图文教程
2018/09/18 Python
在python tkinter中Canvas实现进度条显示的方法
2019/06/14 Python
Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法示例
2019/10/17 Python
关于TensorFlow新旧版本函数接口变化详解
2020/02/10 Python
Python字符串对齐、删除字符串不需要的内容以及格式化打印字符
2021/01/23 Python
科沃斯机器人官网商城:Ecovacs
2016/08/29 全球购物
6号汽车旅馆预订:Motel 6
2018/02/11 全球购物
美国NBA官方商店:NBA Store
2019/04/12 全球购物
学校党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
情侣之间的道歉短信
2015/05/12 职场文书
2015年党支部书记工作总结
2015/05/21 职场文书
《小摄影师》教学反思
2016/02/18 职场文书
python简单验证码识别的实现过程
2021/06/20 Python
win10系统计算机图标怎么调出来?win10调出计算机图标的方法
2022/08/14 数码科技