面试官问我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 08 MySQL
MySQL优化之如何写出高质量sql语句
May 17 MySQL
带你学习MySQL执行计划
May 31 MySQL
MySQL配置主从服务器(一主多从)
Aug 07 MySQL
MySQL数据库必备之条件查询语句
Oct 15 MySQL
Mysql Innodb存储引擎之索引与算法
Feb 15 MySQL
MySQL优化及索引解析
Mar 17 MySQL
mysql中数据库覆盖导入的几种方式总结
Mar 25 MySQL
MySQL去除密码登录告警的方法
Apr 20 MySQL
MySQL数据库如何查看表占用空间大小
Jun 10 MySQL
MySQL主从切换的超详细步骤
Jun 28 MySQL
mysql数据库如何转移到oracle
Dec 24 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
漫威DC即将合作联动,而双方早已经秘密开始
2020/04/09 欧美动漫
一个程序下载的管理程序(四)
2006/10/09 PHP
ThinkPHP模板判断输出Present标签用法详解
2014/06/30 PHP
推荐10个提供免费PHP脚本下载的网站
2014/12/31 PHP
PHP实现的限制IP投票程序IP来源分析
2016/05/04 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
2019/12/20 PHP
用于table内容排序
2006/07/21 Javascript
jquery 插件之仿“卓越亚马逊”首页弹出菜单效果
2008/12/25 Javascript
js几个验证函数代码
2010/03/25 Javascript
node.js中的fs.rmdirSync方法使用说明
2014/12/16 Javascript
PHP配置文件php.ini中打开错误报告的设置方法
2015/01/09 PHP
js实现文字闪烁特效的方法
2015/12/17 Javascript
JavaScript 浏览器兼容性总结及常用浏览器兼容性分析
2016/03/30 Javascript
jQuery插件HighCharts绘制2D圆环图效果示例【附demo源码下载】
2017/03/09 Javascript
基于input框覆盖掉数字英文的实例讲解
2017/07/21 Javascript
快速将Vue项目升级到webpack3的方法步骤
2017/09/14 Javascript
vue 每次渲染完页面后div的滚动条保持在最底部的方法
2018/03/17 Javascript
vue.js内置组件之keep-alive组件使用
2018/07/10 Javascript
[03:02]2014DOTA2西雅图邀请赛 让队员自己告诉你DK NAVI备战情况
2014/07/08 DOTA
Python最长公共子串算法实例
2015/03/07 Python
Python 3.6 读取并操作文件内容的实例
2018/04/23 Python
python实现守护进程、守护线程、守护非守护并行
2018/05/05 Python
python 将print输出的内容保存到txt文件中
2018/07/17 Python
Python3实现的简单工资管理系统示例
2019/03/12 Python
Django web框架使用url path name详解
2019/04/29 Python
Django框架封装外部函数示例
2019/05/28 Python
使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解
2020/01/25 Python
matplotlib 对坐标的控制,加图例注释的操作
2020/04/17 Python
python 实现压缩和解压缩的示例
2020/09/22 Python
HTML5和以前HTML4的区别整理
2013/10/20 HTML / CSS
英国著名国际平价时尚男装品牌:Topman
2016/08/27 全球购物
银行介绍信范文
2014/01/10 职场文书
保安部任务及岗位职责
2014/02/25 职场文书
期末考试复习计划
2015/01/19 职场文书
幼儿园小班教师随笔
2015/08/14 职场文书
python生成随机数、随机字符、随机字符串
2021/04/06 Python