共计 4616 个字符,预计需要花费 12 分钟才能阅读完成。
关注“Java 后端技术全栈 ”
回复“面试”获取全套面试材料
字数:3620,浏览耗时:4 分 35 秒
最近群里一位兄弟在面试中被问到:「MySQL 的架构体系是什么」。
尽管他搞 java 开发好几年了,也始终应用的是 MySQL 数据库,然而面对这个问题仍然是一脸懵逼,还认为面试官要问索引、慢查问、性能优化之类的(因为这些都是网上找点面试题背过了)。
但这位面试官不按套路出牌,这位兄弟当场就是脸红耳赤的,心想 nnd 竟然会这么问。其实面试中面试官的问题有千千万,有的问题的确背反面试题就能应答,但不是所有的面试题咱们都能背下来的。
明天咱们就来聊聊 MySQL 的架构体系,只管咱们是 java 开发人员,然而在日常开发过程中也会常常和 MySQL 数据库打交道。如果公司有 DBA 无能点事还略微好点,如果是没有 DBA 或者 DBA 没什么卵用的状况下,咱们还是很有必要理解 MySQL 的整个体系的,况且在面试中遇到了也是一个加分项。
想要晓得一条 SQL 是怎么查问的,只有对 MySQL 整个体系搞清楚了,能力说出个 123。
所以于情于理,咱们很有必要学习一下 MySQL 的架构体系的。
平时,和小伙伴们聊天的时候,常常会把 MySQL 当做咱们开发的一个软件系统,既然是软件系统,那么就有个架构图,以及架构是如何分层的,每一层的性能是什么。
上面咱们就来看看 MySQL 的整体架构图。
MySQL 架构图
再来看看咱们开发的零碎架构图:
其实还是蛮类似的。都有分层的概念。既然咱们开发的软件系统能进行分层,那么 MySQL 能分层吗?
答案是:能,上面咱们就来聊聊 MySQL 的分层状况以及每一层的性能。
架构图分层
下面的架构图咱们能够对其进行拆分,并做简要的阐明。
连贯层
与客户端打交道,下面曾经写明了能反对的的语言。客户端的链接反对的协定很多,比方咱们在 Java 开发中的 JDBC。
服务层
连接池
次要是负责存储和治理客户端与数据库的链接,一个线程负责管理一个连贯。自从引入了连接池当前,官网报道:当数据库的连接数达到 128 后,应用连接池与没有连接池的性能是晋升了 n 倍(反正就是性能大大的晋升了)。
连贯建设实现后,就能够执行 select 语句了。执行逻辑就会先来到缓存模块。
缓存
MySQL 拿到一个查问申请后,会先到查问缓存看看,之前是不是执行过这条语句。之前执行过的语句及其后果会以 key-value 对的模式存储在内存中。key 是查问的语句,value 是查问的后果。如果你的查问可能间接在这个缓存中找到 key(命中),那么这个 value 就会被间接返回给客户端。
如果在缓存中未命中,就会持续前面的执行阶段。执行实现后,执行后果会被存入查问缓存中。这里能够看到,如果查问命中缓存,MySQL 不须要执行前面的简单操作,就能够间接返回后果,这个效率会很高。
然而大多数状况下我会倡议你不要应用查问缓存,为什么呢?因为查问缓存往往弊大于利。
查问缓存的生效十分频繁,只有有对一个表的某一条数据更新,这个表上所有的查问缓存都会被清空。
因而可能很吃力地把后果存起来,还没应用呢,就被一个更新全清空了。对于更新压力大的数据库来说,查问缓存的命中率会非常低。除非你的业务就是有一张动态表,很长时间才会更新一次。
比方:一个系统配置表,那这张表上的查问才适宜应用查问缓存。
好在 MySQL 也提供了这种“按需应用”的形式。你能够将参数 query_cache_type 设置成 DEMAND,这样对于默认的 SQL 语句都不应用查问缓存。
「留神」:MySQL 8.0 版本间接将查问缓存的整块性能删掉了,标记着 MySQL8.0 开始彻底没有缓存这个性能了。
解析器
如果没有命中查问缓存,就要开始真正执行语句了。首先,MySQL 须要晓得你要做什么,因而须要对 SQL 语句做解析。
分析器先会做“词法剖析”。你输出的是由多个字符串和空格组成的一条 SQL 语句,MySQL 须要辨认出外面的字符串别离是什么,代表什么。
做完了词法剖析当前,就要做“语法分析”。依据词法剖析的后果,语法分析器会依据语法规定,判断你输出的这个 SQL 语句是否满足 MySQL 语法。
如果咱们在拼写 SQL 时候,少了或者写错了某个字母,,就会收到“You have an error in your SQL syntax”的谬误揭示。
比方上面这个案例:
谬误在于 WHERE 关键字中差了一个 E。
同样,咱们应用的 SQL 如果某个字段不存在。
个别语法错误会提醒第一个呈现谬误的地位,所以你要关注的是紧接“use near”的内容,仅供参考,有时候这个提醒也不是十分靠谱。
通过分析器对 SQL 进行了剖析,并且没有报错。那么此时就进入优化器中,对 SQL 进行优化。
优化器
优化器次要是在咱们的数据库表中,如果存在多个多个索引的时候,决定应用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连贯程序。
比如说:
SELECT a.id, b.id FROM t_user a join t_user_detail b WHERE a.id=b.user_id and a.user_name='田维常' and b.id=10001
它会在条件查问上进行优化解决。
优化器解决实现过后,此时就曾经确定了 SQL 的执行计划。而后持续进入执行器中。
执行器
首先,必定是要判断权限,就是有没有权限执行这条 SQL。工作中可能会对某些客户端进行权限管制。
比如说:生产环境中,对于大部分开发人员都只开查问权限,没有增删改权限(局部小公司除外)。
如果有权限,就关上表继续执行。关上表的时候,执行器就会依据表的引擎定义,去应用这个引擎提供的接口。
存储引擎层
存储引擎的概念是 MySQL 外面才有的,不是所有的关系型数据库都有存储引擎这个概念。
数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)应用数据引擎进行创立、查问、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定程度等性能,应用不同的存储引擎,还能够取得特定的性能。当初许多不同的数据库管理系统都反对多种不同的数据引擎。
因为在关系数据库中数据的存储是以表的模式存储的,所以存储引擎也能够称为表类型 (Table Type,即存储和操作此表的类型)。
- MySQL5.5 版本 (mysql 版本 < 5.5 版本) 以前,默认应用的存储引擎是 MyISAM。
- MySQL5.5 版本 (mysql 版本 >= 5.5 版本) 当前,默认应用的存储引擎是 InnoDB。
上面对局部绝对应用多的引擎进行一个比照:
在理论我的项目中,大多数应用 InnoDB,而后是 MyISAM,至于其余存储引擎应用的十分至多。
MyISAM 与 InnoDB 引擎的区别
Mysql5.5 版本之前默认的存储引擎就是 MyISAM 存储引擎,MySQL 中比拟多的零碎表应用 MyISAM 存储引擎,零碎长期表也会用到 MyISAM 存储引擎,然而在 Mysql5.5 之后默认的存储引擎就是 InnoDB 存储引擎了。
两个次要起因:
- 第一个起因是 MyISAM 是表级锁定,限度了数据库读 / 写的性能;
- 另外一个起因是 MyISAM 不反对事务,基于以上两点,InnoDB 引擎能够锁到行。
如何在两种存储引擎中进行抉择?
- 是否有事务操作?有,InnoDB。
- 是否存储并发批改?有,InnoDB。
- 是否谋求疾速查问,且数据批改较少?是,MyISAM。
- 是否应用全文索引?如果不援用第三方框架,能够抉择 MyISAM,然而能够选用第三方框架和 InnDB 效率会更高。
系统文件存储层
系统文件存储层次要是负责将数据库的数据和日志存储在零碎的文件中,同时实现与存储引擎的之间的打交道,是文件的物理存储层。
比方:数据文件、日志文件、pid 文件、配置文件等。
数据文件
「db.opt 文件」:记录这个数据库的默认应用的字符集和校验规定。
「frm 文件」:存储于边相干的元数据信息,蕴含表构造的定义信息等,每一张表都会有一个 frm 文件与之对应。
「MYD 文件」:MyISAM 存储引擎专用的文件,存储 MyISAM 表的数据信息,每一张 MyISAM 表都有有一个.MYD 文件。
「MYI 文件」:也是 MyISAM 存储引擎专用的文件,寄存 MyISAM 表的索引相干信息,每一张 MyISAM 表都有对应的.MYI 文件。
「ibd 文件和 ibdata 文件」:寄存 InnoDB 的数据文件(包含索引)。InnoDB 存储引擎有两种表空间形式:独立表空间和共享表空间。
- 独享表空间应用 ibd 文件来存放数据,并且每一张 InnoDB 表存在与之对应的.ibd 文件。
- 共享表空间应用 ibdata 文件,所有表独特应用一个或者多个.ibdata 文件。
「ibdata1 文件」:零碎表空间数据文件,存储表元数据、Undo 日志等。
「ib_logfile0、ib_logfile0 文件」:Redo log 日志文件。
日志文件
谬误日志:默认是开启状态,能够通过命令查看:
show variables like '%log_error%';
二进制日志 binary log:记录了对 MySQL 数据库执行的更改操作,并且记录了语句的产生工夫、执行耗时;然而不记录查问 select、show 等不批改数据的 SQL。次要用于数据库复原和数据库主从复制。也是大家常说的 binlog 日志。
show variables like '%log_log%';// 查看是否开启 binlog 日志记录。show variables like '%binllog%';// 查看参数
show binary logs;// 查看日志文件
慢查问日志:记录查询数据库超时的所有 SQL,默认是 10 秒。
show variables like '%slow_query%';// 查看是否开启慢查问日志记录。show variables '%long_query_time%';// 查看时长
通用查问日志:记录个别查问语句;
show variables like '%general%';
配置文件
用于寄存 MySQL 所有的配置信息的文件,比方:my.cnf、my.ini 等。
「pid 文件」
pid 文件是 mysqld 应用程序在 Linux 或者 Unix 操作系统下的一个过程文件,和许多其余 Linux 或者 Unix 服务端程序一样,该文件放着本人的过程 id。
「socket 文件」
socket 文件也是 Linux 和 Unix 操作系统下才有的,用户在 Linux 和 Unix 操作系统下客户端连贯能够不通过 TCP/IP 网络而间接应用 Unix socket 来连贯 MySQL 数据库。
SQL 查问流程图
总结
MySQL 整个零碎咱们能够看成是咱们日常开发的软件系统,也有接入层,专门对接里面客户端的,和咱们零碎的网关就很像,缓存也就相似咱们业务代码中应用的缓存,解析器能够了解为业务零碎中参数解析以及参数校验,优化层能够当做咱们开发代码优化的伎俩,而后存储引擎就相当于咱们的长久层,文件系统相当于整个业务零碎中的数据库。
可能比喻不是十分的失当,然而心愿大家能领略轻重的含意,目标只有一个,那就是让大家能轻松把握 MySQL 的整体状况。
不要天天艳羡什么大牛,什么大神,他们也是一步一步来的(个例除外)。自信点,只有你一点一点搞,踏踏实实的干,你也会成为大神的。
文中图片来源于网络,侵删!
举荐浏览
把握 Mybatis 动静映射,我可是下了功夫的
2020 所有原创
写给大忙人看的 JAVA 核心技术.pdf 下载
图解多线程
给,我私藏的 26 道 MyBatis 面试题~
搞定这 24 道 JVM 面试题,要价 30k 都有底气~