关键词:
文章目录
MySQL体系结构
下图来自《MySQL技术内幕(InnoDB存储引擎)第2版》书中的图:
然后我们根据这个图来讲解一下每个部分的功能和作用。
Client connector
首先我们可以看到最上面的 connector部分负责处理客户端的连接请求,与客户端创建连接,目前MySQL几乎支持所有的连接类型,例如常见的JDBC、Python、GO等。
应用程序通过接口( 如ODBC、JDBC)来连接MySQL。最先连接处理的是连接层,连接层包括通信协议、线程处理、用户名密码认证三个部分。
- 通信协议负责检测客户端版本是否兼容MySQL服务端。
- 线程处理是指每一个连接请求都会分配一个对应的线程,
- 相当于一条SQL对应一个线程,一个线程对应一个逻辑 CPU,并会在多个逻辑CPU之间进行切换。
- 用户认证也就是用户登录身份的认证和鉴权和安全管理,就是用户执行操作权限校验。
MySQL Server
下面就是MySQL Server部分
Connection pool
这里包括connection pool,数据库给客户端创建的连接都在这里处理和存储,用一个线程管理一个连接,包括了用户认证:也就是用户登录身份的认证和鉴权和安全管理:就是用户执行操作权限校验。验证用户名和密码是否正确(数据库mysql的user表中进行验证),如果错误返回错误通知(Access denied for user ‘’@‘localhost’ to database ‘mysql’),如果正确,则会去 mysql 的权限表(mysql中的 user、db、columns_priv、Host 表,分别存储的是全局级别、数据库级别、表级别、列级别、配合 db 的数据库级别)查询当前用户的权限。
Service utilities
service utilities是管理服务&工具集,包括备份恢复、安全管理、集群管理服务和工具。
SQL 层
SQL层包含权限判断、查询缓存、解析器、预处理、查询优化器、缓存和执行计划。
-
查询缓存通过 Query Cache 进行操作,如果数据在 Query Cache 中,则直接返回结果给客户端。
-
查询解析器针对 SQL 语句进行解析,判断语法是否正确。预处理器对解析器无法解析的语义进行处理。
-
优化器对 SQL 进行改写和相应的优化,并生成最优的执行计划,就可以调用程序的 API 接口,通过存储引擎层访问数据。
SQL interface
负责接收客户端来的各种SQL语句比如DML、DDL和存储过程等
解析器(Parser)
对客户端传来的 sql 进行分析,这将包括预处理与解析过程,并进行关键词的提取、解析,并组成一个解析树。具体的解析词包括但不局限于 select/update/delete/or/in/where/group by/having/count/limit
等,如果分析到语法错误,会直接抛给客户端异常:ERROR:You have an error in your SQL syntax
.
比如:select * from user where userId =1234
;
在分析器中就通过语义规则器将select from where
这些关键词提取和匹配出来,mysql会自动判断关键词和非关键词,将用户的匹配字段和自定义语句识别出来。这个阶段也会做一些校验:比如校验当前数据库是否存在user表,同时假如User表中不存在userId这个字段同样会报错:unknown column in field list
.
优化器(Optimizer)
进入优化器说明sql语句是符合标准语义规则并且可以执行。优化器会根据执行计划选择最优的选择,匹配合适的索引,选择最佳的方案。比如一个典型的例子是这样的:
表T,对A、B、C列建立联合索引(A,B,C),在进行查询的时候,当sql查询条件是:select xx where B=x and A=x and C=x
.很多人会以为是用不到索引的,但其实会用到,虽然索引必须符合最左原则才能使用,但是本质上,优化器会自动将这条sql优化为:where A=x and B=x and C=x
,这种优化会为了底层能够匹配到索引,同时在这个阶段是自动按照执行计划进行预处理,mysql会计算各个执行方法的最佳时间,最终确定一条执行的sql交给最后的执行器
缓存(Cache)
也称为查询缓存,存储的数据是以键值对的形式进行存储,如果开启了缓存,那么在一条查询sql语句进来时会先判断缓存中是否包含当前的sql语句键值对,如果存在直接将其对应的结果返回,如果不存在再执行后面一系列操作。如果没有开启则直接跳过。
相关操作:
查看缓存配置:show variables like ‘have_query_cache’;
查看是否开启:show variables like ‘query_cache_type’;
查看缓存占用大小:show variables like ‘query_cache_size’;
查看缓存状态信息:show status like ‘Qcache%’;
缓存失效场景:
查询语句不一致。前后两条查询SQL必须完全一致。
查询语句中含有一些不确定的值时,则不会缓存。比如 now()、current_date()、curdate()、curtime()、rand()、uuid()等。
不使用任何表查询。如 select ‘A’;
查询 mysql、information_schema 或 performance_schema 数据库中的表时,不会走查询缓存。
在存储的函数,触发器或事件的主体内执行的查询。
如果表更改,则使用该表的所有高速缓存查询都变为无效并从缓存中删除,这包括使用 MERGE 映射到已更改表的表的查询。一个表可以被许多类型的语句改变,如 insert、update、delete、truncate rable、alter table、drop table、drop database。
通过上面的失效场景可以看出缓存是很容易失效的,所以如果不是查询次数远大于修改次数的话,使用缓存不仅不能提升查询效率还会拉低效率(每次读取后需要向缓存中保存一份,而缓存又容易被清除)。所以在 MYSQL5.6默认是关闭缓存的,并且在 8.0 直接被移除了。
存储引擎
再下面是MySQL所支持的各个存储引擎,这里只是举例写了一些。有最原始的MyISAM,以及InnoDB、支持归档的Archive和内存的Memory等。MySQL是插件式的存储引擎,只要写好跟MySQL Server的接口,任何引擎都可以进入MySQL里来,这也是MySQL流行的原因之一.
物理存储层
最下面是物理存储层,是文件的物理存储,包括二进制日志、数据文件、错误日志、慢查询日志、全日志,redo/undo日志等。
参考
五分钟告诉你什么是mysql的覆盖索引(代码片段)
文章目录五分钟告诉你什么是MySQL的覆盖索引覆盖索引总结参考五分钟告诉你什么是MySQL的覆盖索引前面我们已经对MySQL索引底层原理多少有一定的了解了,还不是很了解的小伙伴可以看我之前的博文:《不会吧不会吧,难... 查看详情
五分钟了解mysql脏读幻读不可重复读mvcc(代码片段)
点击上方关注“终端研发部”设为“星标”,和你一起掌握更多数据库知识首先对多事务并发的问题的思考对innodb引擎执行流程 和bufferpool足够了解的话,那一定知道mysql系统在初始化的时候bufferpool会将内存分为多个缓... 查看详情
五分钟了解抽象语法树(ast)babel是如何转换的?(代码片段)
抽象语法树什么是抽象语法树?Itisahierarchicalprogramrepresentationthatpresentssourcecodestructureaccordingtothegrammarofaprogramminglanguage,eachASTnodecorrespondstoanitemofasourcecode.抽象语法树是源代码语法结构的一种抽象表示。它以树状的形式表现编程语... 查看详情
docker:十五分钟快速了解docker快速部署nginx(代码片段)
Docker目录Dockerdocker为什么出现?Docker的历史和作用Docker安装Docker的组成结构安装Docker阿里云的容器加速底层原理常用命令练习部署nginx总结docker为什么出现?一款产品:开发–上线两套环境,两套配置开发和运维... 查看详情
五分钟让你了解rpc原理详解(代码片段)
RPC功能目标RPC的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。?为实现该目标,RPC框架需提供一种透明调用机制让使用者不必显式的区分本地调用和远程调用。... 查看详情
五分钟搞懂mysql索引下推(代码片段)
大家好,我是老三,今天分享一个小知识点——索引下推。如果你在面试中,听到MySQL5.6”、“索引优化”之类的词语,你就要立马get到,这个问的是“索引下推”。什么是索引下推索引下推(IndexConditionPushdown&... 查看详情
五分钟搞懂mysql索引下推(代码片段)
大家好,我是老三,今天分享一个小知识点——索引下推。如果你在面试中,听到MySQL5.6”、“索引优化”之类的词语,你就要立马get到,这个问的是“索引下推”。什么是索引下推索引下推(IndexConditionPushdown&... 查看详情
五分钟,让你明白mysql是怎么选择索引《死磕mysql系列六》(代码片段)
一网打尽MySQL的各种锁系列文章一、如何选择索引影响优化器的几大因素扫描行数从何而来?为什么优化器选择了扫描行数多的索引?二、索引选择异常如何处理三、总结系列文章二、一生挚友redolog、binlog《死磕MySQL系列... 查看详情
五分钟搞懂vuex(代码片段)
这段时间一直在用vue写项目,vuex在项目中也会依葫芦画瓢使用,但是总有一种朦朦胧胧的感觉。于是决定彻底搞懂它。看了一下午的官方文档,以及资料,才发现vuexsoeasy!作为一个圈子中的人,决定输出一下文档,如果你仔细... 查看详情
思维模型五分钟了解<dikw模型>,什么是dikw模型?以dikw为基础的三次跃迁,如何用dikw模型知识体系?(代码片段)
【思维模型】五分钟了解<DIKW模型>,什么是DIKW模型?以DIKW为基础的三次跃迁,如何用DIKW模型知识体系?1.什么是DIKW模型?2.以DIKW为基础的三次跃迁3.如何用DIKW模型知识体系4.小结参考:数据化分析、... 查看详情
五分钟上手echarts教程(代码片段)
...案例:https://download.csdn.net/download/TroyeSivanlp/33199899五分钟上手ECharts教程1-Echarts-介绍2-了解Echarts的基础配置3-如何在页面上显示简单的图表首先,初始化echarts实例对象第二步,指定配置项和数据(option)第三步,将配... 查看详情
五分钟带你玩转elasticsearch还不了解elasticsearch?带你全方位认知(代码片段)
概述Elasticsearch是面向文档(documentoriented)的,这意味着它可以存储整个对象或文档(document)。然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。在Elasticsearch中,你可以对文档(而非成行成列的... 查看详情
五分钟带你玩转elasticsearch还不了解elasticsearch?带你全方位认知(代码片段)
概述Elasticsearch是面向文档(documentoriented)的,这意味着它可以存储整个对象或文档(document)。然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。在Elasticsearch中,你可以对文档(而非成行成列的... 查看详情
图解redis五种数据结构底层实现(动图哦)(代码片段)
...五种结构的底层数据结构是怎样的吗?今天我们来花费五分钟的时间了解一下。(目前redis版本为3.0.6)动态字符串SDSSDS是"simpledynamicstring"的缩写。redis中所有场景中出现的字符串,基本都是由SDS来实现的所有非数字的key。例如 s... 查看详情
一文了解数据库操作--mysql(25分钟)(代码片段)
...习了解数据库操作✅创作者:贤鱼⏰预计时间:25分钟🎉个人主页:贤鱼的个人主页🔥专栏系列:网络安全mysql数据库数据库简述数据库sql和nosql常见关系型数据库sql语言简单教程进入数据库数据库操作创... 查看详情
一文了解数据库操作--mysql(25分钟)(代码片段)
...习了解数据库操作✅创作者:贤鱼⏰预计时间:25分钟🎉个人主页:贤鱼的个人主页🔥专栏系列:网络安全mysql数据库数据库简述数据库sql和nosql常见关系型数据库sql语言简单教程进入数据库数据库操作创... 查看详情
带你了解mysql数据库的基础操作及用户管理!(代码片段)
MySQL数据库的基础操作及用户管理一.数据库的基本命令1.登录数据库2.查询库3.进入使用库4.查询表5.查询库结构或者表结构6.退出数据库二.常用的数据类型三.主键和外键1.主键2.外键3.主键表和外键表的理解4.主表从表以及主键外... 查看详情
白日梦的mysql专题(第38篇文章)8分钟回顾mysql的索引(代码片段)
目录公众号首发-推荐阅读原文-格式更好看一、导读二、聚簇索引三、二级索引四、联合索引4.1、什么是联合索引4.2、左前缀原则4.3、联合索引的分组&排序五、覆盖索引六、倒排索引公众号首发-推荐阅读原文-格式更好看点击... 查看详情