一文搞懂MySQL运行机制原理
目录
- 前言
- MySQL服务器体系架构
- 网络连接层
- 服务层
- 存储引擎层
- 系统文件层
- 服务器处理客户端请求
- 连接管理
- 解析与优化
- 查询缓存
- 语法解析
- 查询优化
- 存储引擎
- 小结
前言
前文我们了解了MySQL采用客户端/服务器架构,用户通过客户端程序发送增删改查需求,服务器程序收到请求后处理,并且把处理结果返回给客户端。这篇文章主要看下MySQL服务端是如何处理客户端的请求,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
MySQL服务器体系架构
MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层。
网络连接层
客户端连接器:提供与MySQL服务器建立的支持。
服务层
主要包含系统管理和控制工具、连接池、SQL接口、解析器、查询优化器和缓存六个部分。
- 1) 连接池:存储和管理客户端与数据库的连接。
- 2) 系统管理和控制工具:集群、备份、安全管理。
- 3) SQL接口:接受客户端发送的各种SQL命令并返回查询结果。
- 4) 解析器:解析SQL,生成一颗解析树,验证SQL是否合法。
- 5) 查询优化器:将解析树转化成执行计划,与存储引擎进行交互。
- 6) 缓存:各种缓存,比如表、记录、权限等等,缓存有命中查询结果直接返回。
存储引擎层
负责MySQL中数据的存储与提取,与底层系统文件进行交互,可插拔,常见的两类:MyISAM和InnoDB。
系统文件层
负责将数据库的数据和日志存储在文件系统之上,并完成与存储引擎的交互,比如日志、配置文件等等。
服务器处理客户端请求
客户端可以向服务器发送增删改查等各类请求,我们来看一下服务器是如何处理客户端发送的请求。
连接管理
客户端与服务器进程建立连接,每当有一个客户端进程连接到服务器进程时,服务器进程都会创建一个线程来专门处理与这个客户端的交互,当该客户端退出时会与服务器断开连接,服务器会把线程缓存起来。
解析与优化
查询缓存
如果两个查询请求在任何字符上的不同都会导致缓存不命中。请求中包含某些系统函数、用户自定义变量和函数、一些系统表也不会被缓存。
只要该表的结构或者数据被修改,则该表的所有高速缓存查询都将无效并删除。
PS:8.0中查询缓存已经删除了
语法解析
如果查询缓存没有命中,就进入查询阶段,服务器先对文本做分析,判断语法是否正确,然后从文本中将要查询的表、各种查询条件都提取出来放到内部使用的一些数据结构上。
算是一个编译过程,涉及词法解析、语法分析、语义分析等阶段。
查询优化
对SQL做优化,生成一个执行计划,表明了应该使用哪些索引进行查询,表之间的连接顺序是怎样的。
我们可以使用Explain来查看某个语句的执行计划。
存储引擎
完成查询优化之后还没有真正去访问真实的数据表,数据的存储和提取操作都封装到了这个模块里。不同存储引擎管理的表具体的存储结构可能不同,采用存取算法也可能不同。
小结
MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层。mysql执行查询的过程如下:
- 客户端先发送查询语句给服务器
- 服务器检查缓存,如果存在则返回
- 进行sql解析,生成解析树,再预处理,生成第二个解析树,最后再经过优化器,生成真正的执行计划
- 根据执行计划,调用存储引擎的API来执行查询
- 将结果返回给客户端。
到此这篇关于一文搞懂MySQL运行机制原理的文章就介绍到这了,更多相关MySQL运行机制内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
相关推荐
-
Docker中优化Mysql运行内存的操作
使用docker stats查询运行内存,从这里可以看到,我的mysql一共用了400mb内存.经过下面操作可以优化为只占用100mb内存. 1.进入容器 docker exec -it mysql01 bash 2.安装vim 我们需要进入容器当中进行修改容器里面的配置文件,可能有的服务器是没有安装vim的,所以我们没有的需要安装的. apt-get update apt-get install vim 3.修改配置 docker进入mysql容器内,进入/etc/mysql/conf.d 目
-
使用 docker-compose 运行 MySQL的方法
目录结构 . │ .env │ docker-compose.yml │ └─mysql ├─config │ my.cnf │ └─data mysql 目录下的 data 为数据目录,mysql 的数据表.二进制日志文件就在这里..env 文件包含了一些变量,这些变量可以在 docker-compose.yml 文件中通过 ${variable_name} 来引用. 当然也可以把 mysql 的目录放到其它地方,这里图个方便,直接放在 yml 文件同级目录了. .env 文件 MYSQL_R
-
win2008 r2 服务器php+mysql+sqlserver2008运行环境配置(从安装、优化、安全等)
win2008 r2 安装 http://www.jb51.net/article/38048.htm iis的安装 http://www.jb51.net/article/86390.htm php的安装注意事项: 下载非安全线程 版本 nts php 5.2.17 http://www.jb51.net/softs/268745.html 其它版本可以到 http://museum.php.net/php5/里面很多经典的老版本. PHP 5.5 (5.5.36) VC11 x64 Non
-
MySQL运行报错:“Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre”解决方法
目录 项目场景: 问题描述 原因分析: 解决方案: 总结 项目场景: 最近在部署项目之后,运行出现报错: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘grades.order_id’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible wi
-
MySQL MHA 运行状态监控介绍
目录 一 项目描述 1.1 背景 1.2 实现设计 1.2.1 之前的方法 1.2.2 优化后的方法 二.实现详情 2.1 编辑Python可执行文件 2.2 修改 telegraf 文件 2.3 修改telegraf service的运行账号 2.4 启动Telegraf 服务 2.5 配置Grafana,增加Panel 三 .实现 一 项目描述 1.1 背景 MHA(Master HA)是一款开源的 MySQL 的高可用程序,它为 MySQL 主从复制架构提供了 automating mas
-
Docker创建运行多个mysql容器的方法示例
1.使用mysql/mysql-server:latest镜像快速启动一个Mysql实例 docker run --name ilink_user_01 -e MYSQL_ROOT_PASSWORD=123456 0d 0p 3307:3306 mysql/mysql-server:latest ilink_user_01是容器名称,通过--name指令指定 123456为数据库root的密码,通过-e指定环境MYSQL_ROOT_PASSWORD为123456,-e (指定容器内的环境变量)
-
mysql运行net start mysql报服务名无效的解决办法
运行net start mysql报服务名无效的解决办法,供大家参考,具体内容如下 1. 症状 以前电脑上安装了 MySQL,今天在电脑上运行,发现没有 MySQL 服务了 C:UsersAdministrator>net start mysql 服务名无效. 请键入 NET HELPMSG 2185 以获得更多的帮助 2. 解决办法 输入 mysqld.exe -install MySQL 安装在:D:\wamp\bin\mysql\mysql5.1.53 以上就是本文的全部内容,希望对大家的
-
一文搞懂MySQL运行机制原理
目录 前言 MySQL服务器体系架构 网络连接层 服务层 存储引擎层 系统文件层 服务器处理客户端请求 连接管理 解析与优化 查询缓存 语法解析 查询优化 存储引擎 小结 前言 前文我们了解了MySQL采用客户端/服务器架构,用户通过客户端程序发送增删改查需求,服务器程序收到请求后处理,并且把处理结果返回给客户端.这篇文章主要看下MySQL服务端是如何处理客户端的请求,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助. MySQL服务器体系架构 MySQL Server架构自顶向下大致可以分网
-
一文搞懂MySQL持久化和回滚的原理
目录 redo log 为什么要先更新内存数据,不直接更新磁盘数据? 为什么需要redo log? redo log是如何实现的? 为什么一个block设计成512字节? 为什么要两段式提交? crash后是如何恢复的? undo log 什么情况下会生成undo log? undo log是如何回滚的? undo log存在什么地方? redo log 事务的支持是数据库区分文件系统的重要特征之一,事务的四大特性: 原子性:所有的操作要么都做,要么都不做,不可分割. 一致性:数据库从一种状态变
-
一文搞懂Mysql中的共享锁、排他锁、悲观锁、乐观锁及使用场景
目录 一.常见锁类型 二.Mysql引擎介绍 三.常用引擎间的区别 四.共享锁与排他锁 五.排他锁的实际应用 六.共享锁的实际应用 七.死锁的发生 八.另一种发生死锁的情景 九.死锁的解决方式 十.意向锁和计划锁 十一.乐观锁和悲观锁 总结 一.常见锁类型 表级锁,锁定整张表 页级锁,锁定一页 行级锁,锁定一行 共享锁,也叫S锁,在MyISAM中也叫读锁 排他锁,也叫X锁,在MyISAM中也叫写锁 悲观锁,抽象性质,其实不真实存在 乐观锁,抽象性质,其实不真实存在 常见锁类型 二.Mysql引擎
-
一文搞懂MySQL元数据锁(MDL)
目录 一.什么是metadata lock 二.MDL和行锁有什么区别 三.MDL为什么会造成系统崩溃 四.MDL的生命周期有多长 五.如何快速找到阻塞源头 六.本文开始的案例最终如何解决 小结 某日,路上收到用户咨询,为了清除空间,想删除某200多G大表数据,且已经确认此表不再有业务访问,于是执行了一条命令‘delete from bigtable’,但好长时间也没删完,经过咨询后,获知drop table删除表速度快,而且能彻底释放空间,于是又在另外一个session中执行了‘drop ta
-
一文搞懂MySQL预编译
1.预编译的好处 大家平时都使用过JDBC中的PreparedStatement接口,它有预编译功能.什么是预编译功能呢?它有什么好处呢? 当客户发送一条SQL语句给服务器后,服务器总是需要校验SQL语句的语法格式是否正确,然后把SQL语句编译成可执行的函数,最后才是执行SQL语句.其中校验语法,和编译所花的时间可能比执行SQL语句花的时间还要多. 如果我们需要执行多次insert语句,但只是每次插入的值不同,MySQL服务器也是需要每次都去校验SQL语句的语法格式,以及编译,这就浪费了太多的时
-
一文搞懂MySQL XA如何实现分布式事务
目录 前言 XA 协议 如何通过MySQL XA实现分布式事务 前言 MySQL支持单机事务的良好表现毋庸置疑,那么在分布式系统中,涉及多个节点,MySQL又是如何实现分布式事务的呢?比如开发一个业务系统,它接受外部的请求,然后访问多个内部其它系统才能执行该请求.执行时我们需要同时更新多个数据库的值(D1,D2,D3).由于系统必须处于一个一致性,也就是这三个数据库的值要么同时更新成功,要么全部不更新.不然会造成子系统有些指令成功了,有些指令尚未执行.导致对结果理解混乱. 那么,MySQL如何实
-
一篇文章搞懂MySQL加锁机制
目录 前言 锁的分类 乐观锁和悲观锁 共享锁(S锁)和排他锁(X锁) 按加锁粒度区分 全局锁 表级锁(表锁和MDL锁) 意向锁 行锁 间隙锁 next-key lock(临键锁) 加锁规则 死锁和死锁检测 总结 前言 在数据库中设计锁的目的是为了处理并发问题,在并发对资源进行访问时,数据库要合理控制对资源的访问规则. 而锁就是用来实现这些访问规则的一个数据结构. 在对数据并发操作时,没有锁可能会引起数据的不一致,导致更新丢失. 锁的分类 乐观锁和悲观锁 乐观锁: 对于出现更新丢失的可能性比较乐观
-
一文搞懂MySQL脏读,幻读和不可重复读
目录 MySQL 中事务的隔离 1.READ UNCOMMITTED 2.READ COMMITTED 3.REPEATABLE READ 4.SERIALIZABLE 前置知识 1.事务相关的常用命令 2.MySQL 8 之前查询事务的隔离级别 3.MySQL 8 之后查询事务的隔离级别 4.查看连接的客户端详情 5.查询连接客户端的数量 6.设置客户端的事务隔离级别 7.新建数据库和测试数据 8.名称约定 脏读 1.脏读演示步骤1 2.脏读演示步骤2 3.脏读演示步骤3 4.不可重复读 5.
-
一文搞懂MySQL索引页结构
目录 1.前言 2.索引页结构 2.1FileHeader 2.2PageHeader 2.3UserRecords 2.4Infimum&Supremum 2.5PageDirectory 2.6FileTrailer 3.总结 1. 前言 「页」是InnoDB管理存储空间的基本单位,也是内存和磁盘交互的基本单位.也就是说,哪怕你需要1字节的数据,InnoDB也会读取整个页的数据,下次读取的数据如果恰巧也在这个页里,就能命中缓存了.写也是一样的,写数据前要先把页加载到内存,然后在内存中修改,该
-
一文搞懂Java的SPI机制(推荐)
目录 1 简介 缺点 源码 使用 适用场景 插件扩展 案例 1 简介 SPI,Service Provider Interface,一种服务发现机制. 有了SPI,即可实现服务接口与服务实现的解耦: 服务提供者(如 springboot starter)提供出 SPI 接口.身为服务提供者,在你无法形成绝对规范强制时,适度"放权" 比较明智,适当让客户端去自定义实现 客户端(普通的 springboot 项目)即可通过本地注册的形式,将实现类注册到服务端,轻松实现可插拔 缺点 不能按需
随机推荐
- 注册表危险组件删除功能批处理
- 复制文件到c盘windows文件夹下的system32的批处理写法
- 老生常谈JavaScript面向对象基础与this指向问题
- Swift与C语言指针结合使用实例
- 利用js实现选项卡的特别效果的实例
- JavaScript数组去重的几种方法效率测试
- javascript DOM对象的学习实例代码
- PHP发明人谈MVC和网站设计架构 貌似他不支持php用mvc
- JavaScript实现页面跳转的几种常用方式
- jsp页面验证码demo
- ruby 标准类型总结
- Oracle对两个数据表交集的查询
- jQuery+CSS 半开折叠效果原理及代码(自写)
- 另类妙招让您的ADSL全速前进
- Android编程中号码匹配位数修改的方法
- android计算器代码示例分享
- Android利用AsyncTask异步类实现网页内容放大缩小
- C++的虚析构详解及实例代码
- Unity shader实现消融效果
- Android WebView支持input file启用相机/选取照片功能