深入理解MySQL底层架构,看这一篇文章就够了!
前面我们已经讲解了,我们的系统是如何与MySQL打交道的?,我们开发的系统与MySQL本身,都维护的有线程池,管理了所有连接。看下图回顾下:
图1 我们的系统是如何与MySQL打交道的?
从上图我们可以看到,我们通过数据库连接,把要执行的SQL语句发送给MySQL数据库进行增删改查就可以了。
然而MySQL数据库内部到底是怎么运转的呢?
1、网络连接让工作线程去具体执行
一般,网络服务器会分配一个线程或线程池去处理网络连接,把网络连接中读取出来的数据交给另外的线程或线程池处理。如下图所示:
图2 多线程处理网络请求数据
当MySQL内部的工作线程从一个网络连接中读取一个SQL语句后,此时会如何处理这个SQL呢?
2、SQL接口,处理接收到的SQL语句
此时工作线程会把接收到的SQL语句交给一个叫SQL接口的组件执行。SQL接口(SQL interface),是一套执行SQL语句的接口,专门用于执行我们发送给MySQL的那些增删改查的SQL语句。
图3 SQL接口
3、查询解析器:让MySQL读懂你的SQL
接下来SQL接口怎么处理SQL语句呢?MySQL必须理解你的SQL语法,才可以去执行,要理解SQL语法,就要靠查询解析器了。
查询解析器(parser),就是负责对SQL语句进行解析的。按照SQL语法,对我们按照SQL语法编写的SQL语句进行解析。比如对select name, age from user where id = 1这个语句。
1、我们要从user表里查询数据;
2、查询"id"字段值等于1的那行语句;
3、对查出来的那行数据提取name,age两个字段;
图4 SQL查询解析器
4、查询优化器:选择最优的查询路径
通过SQL解析器解析SQL语句,知道要干什么,那么怎么干性能最高呢?
比如,上面那个查询语句:select name, age from user where id = 1
可以有多种查询方式:
1、直接根据id定位到一行数据,然后从中获取name, age;
2、从表中把所有的id,name, age查出来,根据id过滤出来想要的数据;
上面是两种SQL查询方式(不代表MySQL的实现方式),两种查询方式都可以实现目标,哪种性能更好呢?
这就需要查询优化器告诉你。
查询优化器会告诉你,你应该按照一个什么样的步骤和顺序,去执行哪些操作,才能最快的获取结果。现在的图就变成这样了:
图5 查询优化器
5、执行器;根据执行计划调用存储引擎
查询优化器选择了最优的查询路径,知道了按照一个什么样的顺序和步骤去执行这个SQL语句的计划,然后就需要执行器调用存储引擎的接口把SQL语句的逻辑给执行了。
比如,执行器可能会先调用存储引擎的一个接口,去获取user表中的第一行数据,然后判断这个数据的id字段是否等于我们期望的值,如果不是的话,就继续调用存储引擎的接口,获取user表的下一行数据。
基于上述思路,执行器,就会去根据我们的优化器生成的一套执行计划,不停的调用存储引擎的各种接口去完成SQL语句的执行。
图6 执行器
6、调用存储引擎,真正执行SQL语句
执行器把执行计划交给最底层的存储引擎,就会真正的执行SQL语句了。
执行SQL语句,无非是增删改查数据,那么数据是存放在哪里呢?
数据要么是放在内存里,要么是放在磁盘上,所有存储引擎会按一定的步骤去查询内存缓存的数据,更新磁盘数据,等等。
MySQL的架构设计中,SQL接口,SQL解析器,查询优化器,都是通用的,但存储引擎是有很多种的。比如常见的innoDB,myisam。
互联网公司一般选用innoDB存储引擎。
图7 MySQL底层架构
搞清楚了MySQL的底层架构,那么具体执行一条SQL时是怎样的呢?下节我们会讲。
有道无术,术可成;有术无道,止于术
欢迎大家关注Java之道公众号
好文章,我在看❤️
深入理解MySQL底层架构,看这一篇文章就够了!相关推荐
- js层级选择框样式_IOS和JS的交互,看这一篇文章就够了
IOS和JS的交互,看这一篇文章就够了 创作不易,请珍惜,之后会持续更新,不断完善 Demo地址 目录 WKWebView使用.JS的交互 WKWebView使用.JS的交互 演示(本来想贴张GIF作 ...
- 关于VR产品的前世今生,看这一篇文章就够了
关于VR产品的前世今生,看这一篇文章就够了(转) 文/胡勇 即使最富质疑精神最冷静的人也无法漠视现在的 VR/AR 掀起的狂潮,这个从科技圈蔓延到实业界最后席卷大众的想象力的狂欢正以前所未有的态势改变 ...
- 五年程序员是如何玩转闲鱼无货源的,只看这一篇文章就够了
今天的内容方向主要是基础篇-进阶篇 ,优化了一下操作方法,尽量细化,让你看完这篇内容之后从入门到大神. 基础篇: 注册这些基础的之前说过,这次就不说了,这次说下如何养号. 完善个人资料(头像.昵称.简 ...
- 动态规划——01背包问题 看此一篇文章就够了
本文讲述经典算法--动态规划的 常见问题 01背包 一篇文章带你学会01背包问题,妈妈再也不担心我遇到01背包了!!! 问题描述 有n个物品,它们有各自的体积和价值,现有给定容量m的背包,如何让背包 ...
- 产品经理如何进行数据分析?看这一篇文章就够了
一.数据分析的层级 产品的数据分析经常会遇到这样的问题:只有数据,没有分析.仅仅是描述数据,告诉你产品发生了什么. 比如次日留存率只有5%,这个数据偏低,可以看出该功能的用户粘性不好. 然后呢?往往就 ...
- 什么是Docker?看这一篇文章就够了
作者 | 码农的荒岛求生 来源 | 程序员小灰(ID: chengxuyuanxiaohui) 程序员,应该怎样理解docker? 容器技术的起源 假设你们公司正在秘密研发下一个"今日头条& ...
- Dubbo详解,用心看这一篇文章就够了【重点】
1.1 Dubbo概述 Dubbo是阿里巴巴开源的基于 Java 的高性能RPC(一种远程调用) 分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案. 每天为2千 ...
- 对计算机世界中的时区和时间分类总是似懂非懂?看这一篇文章就够了
今天来说说时区和时间.这个问题在新手刚接触的时候总是搞得似懂非懂,所以这里只是把最容易搞混的地方来捋清楚,不专门针对API进行讲解. GMT和UTC时间区别与联系 GMT时间 GMT(Greenwic ...
- scrapy框架_入门Scrapy框架看这一篇文章就够了
前言 Scrapy是一个非常优秀的框架,操作简单,拓展方便,是比较流行的爬虫解决方案. Scrapy是一个用Python写的Crawer Framework,简单轻巧而且非常方便.Scrapy使用Tw ...
最新文章
- 简述数学建模的过程_数学建模的基本步骤
- csv文件怎么转成excel_Python操作Excel文件(1):花式大师pyexcel
- oracle给表赋清空权限,oracle建表赋权限
- 系统性风险与个体性风险
- 计算机不能直接执行c语言编写的源程序,计算机不能直接执行用C语言编写的源程序。...
- 年终总结做得好,升职加薪少不了,仅需1个技巧,10分钟完成
- python搜索关键词自动提交_简单爬虫:调用百度接口,实现关键词搜索(python_003)...
- mysql开启中继日志,MySQL复制应用中继日志解析
- 【洛谷 2863】牛的舞会
- 用java写出死锁的例子_【面试】请写一个java死锁的例子-Go语言中文社区
- 终端天线—7.UWB天线仿真
- 成语答题小程序 开源的成语答题小程序
- LTE手机接收灵敏度究竟如何?
- [机器学习与scikit-learn-20]:算法-逻辑回归-线性逻辑回归linear_model.LogisticRegression与代码实现
- docker安装zabbix怎样修改图标和登录页文字
- php下单声音提醒,拼多多商家怎么设置下单的声音?开启方法是什么?
- 监控平台设计之GraphitePrometheus存储
- mysql打开eqd_Java 使用JDBC连接MySQL
- 局域网的ROS中设置花生壳
- 企业认证3A信用等级
热门文章
- 802.11 n wlan linux驱动下载,802.11n无线网卡驱动
- Php循环函数嵌套javascript,JS循环嵌套问题?
- 日志写入hbase_千亿级日志系统设计思路,牛人必学!
- ctr 平滑_CTR预估中的贝叶斯平滑方法及其代码实现
- HTTP WS 区别
- linux df和du常用命令
- mysql 的节点组是什么_什么是MySQL集群
- Springmvc拦截所有html和Controller,实现未登录则返回登录页,已登录则可以访问需要登录的页面。
- 一个java中HashMap和HashSet的应用实例
- Python3bytes转16进制字符(例如:b111111转\x8c\x8c\x8c\x8c\x8c\x8c)