面试官问我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 06 MySQL
MySQL数据迁移相关总结
Apr 29 MySQL
MySQL创建高性能索引的全步骤
May 02 MySQL
linux下导入、导出mysql数据库命令的实现方法
May 26 MySQL
my.ini优化mysql数据库性能的十个参数(推荐)
May 26 MySQL
Mysql文件存储图文详解
Jun 01 MySQL
浅谈MySQL user权限表
Jun 18 MySQL
浅析MySQL如何实现事务隔离
Jun 26 MySQL
ORM模型框架操作mysql数据库的方法
Jul 25 MySQL
MySQL的全局锁和表级锁的具体使用
Aug 23 MySQL
SQL注入详解及防范方法
Dec 06 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生成静态页面详解
2006/11/19 PHP
PHP程序员常见的40个陋习,你中了几个?
2014/11/20 PHP
js 解决“options为空或不是对象”
2008/12/22 Javascript
Javascript insertAfter() 实现函数代码
2011/10/12 Javascript
Js和JQuery获取鼠标指针坐标的实现代码分享
2015/05/25 Javascript
Javascript中的getUTCDay()方法使用详解
2015/06/10 Javascript
使用AngularJS创建自定义的过滤器的方法
2015/06/18 Javascript
JavaScript淡入淡出渐变简单实例
2015/08/06 Javascript
jquery实现浮动在网页右下角的彩票开奖公告窗口代码
2015/09/04 Javascript
jQuery prototype冲突的2种解决方法(附demo示例下载)
2016/01/21 Javascript
Bootstrap基本插件学习笔记之轮播幻灯片(23)
2016/12/08 Javascript
Vue加载json文件的方法简单示例
2019/01/28 Javascript
nodejs nedb 封装库与使用方法示例
2020/02/06 NodeJs
Windows中安装使用Virtualenv来创建独立Python环境
2016/05/31 Python
python与php实现分割文件代码
2017/03/06 Python
django之session与分页(实例讲解)
2017/11/13 Python
关于Django显示时间你应该知道的一些问题
2017/12/25 Python
详解用Python处理HTML转义字符的5种方式
2017/12/27 Python
python批量从es取数据的方法(文档数超过10000)
2018/12/27 Python
python中的线程threading.Thread()使用详解
2019/12/17 Python
Python sys模块常用方法解析
2020/02/20 Python
python3 sorted 如何实现自定义排序标准
2020/03/12 Python
如何解决python多种版本冲突问题
2020/10/13 Python
世界上最好的威士忌和烈性酒购买网站:The Whisky Exchange
2016/11/20 全球购物
Richards网上商店:当代时尚,遍布巴西
2019/11/03 全球购物
生产主管岗位职责
2013/11/10 职场文书
会计专业大学生职业生涯规划书
2014/02/11 职场文书
名人演讲稿范文
2014/09/16 职场文书
简单租房协议书(范本)
2014/10/13 职场文书
大学生个人简历自荐信
2015/03/06 职场文书
活动经费申请报告
2015/05/15 职场文书
基于Python绘制子图及子图刻度的变换等的问题
2021/05/23 Python
PyTorch dropout设置训练和测试模式的实现
2021/05/27 Python
在前女友婚礼上,用Python破解了现场的WIFI还把名称改成了
2021/05/28 Python
JavaScript异步操作中串行和并行
2021/11/20 Javascript
vue实现移动端div拖动效果
2022/03/03 Vue.js