博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【MySQL】漫谈MySQL体系结构
阅读量:3965 次
发布时间:2019-05-24

本文共 18553 字,大约阅读时间需要 61 分钟。

原创

【MySQL】漫谈MySQL体系结构

版权声明:本文为博主原创文章,遵循版权协议,转载请附上原文出处链接和本声明。
本文链接:
                                                

背景

   
了解MySQL的架构图,对MySQL有一个整体的把握,对于以后深入理解MySQL是有很大帮助的。比如:很多查询优化工作实际上就是遵循一些原则让MySQL的优化器能够按照预想的合理方式运行。 MySQL从概念上分为四层,如下图:

这四层自顶向下分别是
网络连接层,服务层(核心层),存储引擎层,系统文件层
我们自顶向下开始讲解。

网络接入层

作用
     主要负责连接管理、授权认证、安全等等。每个客户端连接都对应着服务器上的一个线程。服务器上维护了一个线程池,避免为每个连接都创建销毁一个线程。当客户端连接到MySQL服务器时,服务器对其进行认证。可以通过用户名与密码认证,也可以通过SSL证书进行认证。登录认证后,服务器还会验证客户端是否有执行某个查询的操作权限。这一层并不是MySQL所特有的技术。
为什么要设计成线程池?

      在服务器内部,每个client都要有自己的线程。这个连接的查询都在一个单独的线程中执行。想象现实场景中数据库访问连接实在是太多了,如果每次连接都要创建一个线程,同时还要负责该线程的销毁。对于系统来说是多么大的消耗。由于线程是操作系统宝贵的资源。这时候线程池的出现就显得自然了,服务器缓存了线程,因此不需要为每个Client连接创建和销毁线程。 

服务层

作用    

      第二层服务层是MySQL的核心,MySQL的核心服务层都在这一层,查询解析,SQL执行计划分析,SQL执行计划优化,查询缓存。以及跨存储引擎的功能都在这一层实现:存储过程,触发器,视图等。通过下图来观察服务层的内部结构:

                                                图中红色框中标出来的就是MySQL服务层内部执行的过程

下面来简单分析SQL语句在服务层中具体的流程:

查询缓存
    在解析查询之前,服务器会检查查询缓存,如果能找到对应的查询,服务器不必进行查询解析、优化和执行的过程,直接返回缓存中的结果集。
解析器与预处理器
    MySQL会解析查询,并创建了一个内部数据结构(解析树)。这个过程解析器主要通过语法规则来验证和解析。比如SQL中是否使用了错误的关键字或者关键字的顺序是否正确等等。预处理会根据MySQL的规则进一步检查解析树是否合法。比如要查询的数据表和数据列是否存在等。
查询优化器
    优化器将其转化成查询计划。多数情况下,一条查询可以有很多种执行方式,最后都返回相应的结果。优化器的作用就是找到这其中最好的执行计划。优化器并不关心使用的什么存储引擎,但是存储引擎对优化查询是有影响的。优化器要求存储引擎提供容量或某个具体操作的开销信息来评估执行时间。
查询引擎
    在完成解析和优化阶段以后,MySQL会生成对应的执行计划,查询执行引擎根据执行计划给出的指令调用存储引擎的接口得出结果。

存储引擎层

作用
    负责MySQL中数据的存储与提取。 服务器中的查询执行引擎通过API与存储引擎进行通信,通过接口屏蔽了不同存储引擎之间的差异。MySQL采用插件式的存储引擎。MySQL为我们提供了许多存储引擎,每种存储引擎有不同的特点。我们可以根据不同的业务特点,选择最适合的存储引擎。如果对于存储引擎的性能不满意,可以通过修改源码来得到自己想要达到的性能。例如阿里巴巴的X-Engine,为了满足企业的需求facebook与google都对InnoDB存储引擎进行了扩充
特点:
    存储引擎是针对于表的而不是针对库的(一个库中不同表可以使用不同的存储引擎),服务器通过API与存储引擎进行通信,用来屏蔽不同存储引擎之间的差异。
下面大致介绍一下MySQL中常见的的存储引擎
InnoDB
    特点:支持事务,适合OLTP应用,假设没有什么特殊的需求,一般都采用InnoDB作为存储引擎。支持行级锁,从MySQL5.5.8开始,InnoDB存储引擎是默认的存储引擎。
MyISAM
    特点
        不支持事务,表锁设计,支持全文索引,主要应用于OLAP应用
    场景
        在排序、分组等操作中,当数量超过一定大小之后,由查询优化器建立的临时表就是MyISAM类型
        报表,数据仓库
Memory
    特点
        数据都存放在内存中,数据库重启或崩溃,表中的数据都将消失,但是标的结构还是会保存下来。默认使用Hash索引。
    场景
        适合存储OLTP应用的临时数据或中间表。
        用于查找或是映射表,例如邮编和地区的对应表。
除此之外还有CSV,Federated、Archive等等。后面会开一篇博客专门讲解MySQL存储引擎。
 

系统文件层

作用
        该层主要是将数据库的数据存储在文件系统之上,并完成与存储引擎的交互。
MyISAM物理文件结构为
为了掩饰我先建一个MyISAM存储引擎的表:

进入MySQL数据存储目录查看数据表在文件上的体现:

.frm文件:与表相关的元数据信息都存放在frm文件,包括表结构的定义信息等。
.MYD文件:MyISAM存储引擎专用,用于存储MyISAM表的数据
.MYI文件:MyISAM存储引擎专用,用于存储MyISAM表的索引相关信息
InnoDB物理文件结构

先建两个InnoD存储引擎的表:

进入MySQL数据存储目录查看数据表在文件上的体现:

注意上面的每个表都有一个*.frm与*.ibd后缀文件他们的作用分别是:
.frm文件:与表相关的元数据信息都存放在frm文件,包括表结构的定义信息等。
.ibd文件:存放innodb表的数据文件。
除了.ibd文件InnoDB还有一种文件的存储格式为.ibdata文件,那么他们之间有什么区别呢? 
这两种文件都是存放innodb数据的文件,之所以用两种文件来存放innodb的数据,是因为InnoDB的数据存储方式能够通过配置来决定是使用共享表空间存放存储数据,还是用独享表空间存放存储数据。独享表空间存储方式使用.ibd文件,并且每个表一个ibd文件。共享表空间存储方式采用.ibdata文件,所有的表共同使用一个ibdata文件,即所有的数据文件都存在一个文件中。决定使用哪种表的存储方式可以通过mysql的配置文件中 innodb_file_per_table选项来指定。InnoDB默认使用的是独享表的存储方式,这种方式的好处是当数据库产生大量文件碎片的时,整理磁盘碎片对线上运行环境的影响较小。
文章最后发布于: 2018-05-11 22:16:32
展开阅读全文
0 个人打赏
私信求帮助
还能输入1000个字符

你等会?大小写这么重要么?

  • 5个月前
    #3楼
    谢谢谢谢谢谢谢谢谢谢
  • 5个月前
    #2楼
    谢谢谢谢谢谢谢谢谢谢
    1
  • 7个月前
    #1楼
    非常棒
  • 上一页
  • 1
  • 下一页

MySQL运行机制原理&架构

12-22 阅读数 2万+

博文

MySQL体系结构图详解

03-30 阅读数 4966

博文

五大开源MySQL管理工具!

12-15 阅读数 4万+

博文

MySql体系架构(一)

03-30 阅读数 482

博文

学会了这些技术,你离BAT大厂不远了

08-26 阅读数 17万+

博文

MySQL】SQL执行计划分析

01-09 阅读数 1万+

博文

程序员真是太太太太太有趣了!!!

08-26 阅读数 1万+

博文

带你认识 MySQLMySQL 体系结构 - 紫羽风的博客 - CSDN博客

10-19

mysql 体系结构 - weixin_33795093的博客 - CSDN博客

5-21

浏览 GitHub 太卡了?教你两招!

09-04 阅读数 2万+

博文

MySQL】常见的业务处理-进行分区间的统计 - 多多说happy的博客 ...

10-30

MySQL体系架构 - cpdiem的博客 - CSDN博客

11-11

MySQL体系结构

02-06 阅读数 9

博文

紫竹风
关注
紫竹风

190篇文章

排名:1000+

Not-Bad
关注
Not-Bad

30篇文章

排名:千里之外

小叔叔乎
关注
小叔叔乎

1203篇文章

排名:5000+

极客-裴泓博
关注
极客-裴泓博

92篇文章

排名:千里之外

吃人的那些 Java 名词:对象、引用、堆、栈

09-05 阅读数 2万+

博文

接班马云的为何是张勇?

09-14 阅读数 4万+

博文

mysql体系结构理解与分析 - weixin_34356138的博客 - CSDN博客

9-1

MYSQL体系结构-来自期刊 - weixin_33901926的博客 - CSDN博客

6-29

深入理解 MySQL 底层实现

12-13 阅读数 2万+

博文

Google 为中国开发者都带来了什么?

09-10 阅读数 4277

博文

漫谈MySQL体系结构

10-31 阅读数 8

博文

Spring高级技术梳理

09-20 阅读数 5241

博文

史上最详细的IDEA优雅整合Maven+SSM框架(详细思路+附带源码)

10-29 阅读数 4万+

博文

接私活必备的 10 个开源项目!

09-17 阅读数 6万+

博文

让程序员崩溃的瞬间(非程序员勿入)

09-16 阅读数 24万+

博文

MySQL】常见的业务处理-进行分区间的统计

01-08 阅读数 3771

博文

从入门到精通,Java学习路线导航(附学习资源)

09-16 阅读数 3274

博文

如何在Windows中开启"上帝模式"

09-23 阅读数 1万+

博文

分享靠写代码赚钱的一些门路

09-25 阅读数 3397

博文

MySQLMySQL数据类型宽度

01-09 阅读数 548

博文

为什么平头哥做芯片如此迅猛?

09-26 阅读数 1万+

博文

武汉为什么进不了互联网第一梯队?

09-08 阅读数 3776

博文

技术人员要拿百万年薪,必须要经历这9个段位

08-24 阅读数 2万+

博文

【电赛】2019电赛纸张计数显示装置(F题)

10-24 阅读数 4102

博文

十大优秀编程项目,让你的简历金光闪闪

10-06 阅读数 2万+

博文

用Python分析2000款避孕套,得出这些有趣的结论

09-18 阅读数 4万+

博文

不要在网站上无限滚动!

09-17 阅读数 1万+

博文

Docker 零基础从入门到使用

09-24 阅读数 1万+

博文

面试官:兄弟,说说基本类型和包装类型的区别吧

09-29 阅读数 3万+

博文

多线程编程是后台开发人员的基本功

09-29 阅读数 1万+

博文

分布式、多线程、高并发都不懂,拿什么去跳槽

10-08 阅读数 1万+

博文

MYSQL8.0以上版本正确修改ROOT密码

08-12 阅读数 3693

博文

飞天智能:阿里云的 AI 落地野心

09-24 阅读数 975

博文

漫画 | 外行对程序员误会有多深!

10-11 阅读数 1万+

博文

刚出炉!年度榜单:Python三连冠,碾压Java!你怎么看?

09-17 阅读数 3113

博文

Linux文件操作高频使用命令

08-28 阅读数 1万+

博文

程序员实用工具网站

09-04 阅读数 19万+

1、搜索引擎

2、PPT

3、图片操作

4、文件共享

5、应届生招聘

6、程序员面试题库

7、办公、开发软件

8、高清图片、视频素材网站

9、项目开源

10、算法

11、在…

博文

我的 Input框 不可能这么可爱

09-03 阅读数 1万+

<input /> 标签是我们日常开发中非常常见的替换元素了,但是最近在刷 whattwg 跟 MDN 的时候发现 跟 <in…

博文

我花了一夜用数据结构给女朋友写个H5走迷宫游戏

09-21 阅读数 17万+

又到深夜了,我按照以往在csdn和公众号写着数据结构!这占用了我大量的时间!我的超越妹妹严重缺乏陪伴而 怨气满满!

而女朋友时常埋怨,认为数据结构这么抽象难懂的东西没啥作用,常会问道…

博文

分享靠写代码赚钱的一些门路

09-26 阅读数 6万+

博文

对计算机专业来说学历真的重要吗?

09-27 阅读数 8万+

这篇文章很长,但绝对是精华,相信我,读完以后,你会知道学历不好的解决方案…

博文

nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件

10-25 阅读数 1万+

博文

【安全】Web渗透测试(全流程)

10-29 阅读数 4604

1.1域名、IP、端口

域名信息查询:信息可用于后续渗透

IP信息查询:确认域名对应IP,确认IP是否真实,确认通信是否正常

端口信息查询:NMap扫描,确认开放端口

如果不…
博文

MySQL数据库—SQL汇总

10-24 阅读数 2万+

博文

python 程序员进阶之路:从新手到高手的100个模块

10-23 阅读数 6万+

博文

Python——画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)

10-22 阅读数 4万+

动…

博文

程序员成长的四个简单技巧,你 get 了吗?

10-23 阅读数 2万+

博文

Linux/C/C++ 不可错过的好书

10-24 阅读数 1万+

作者:守望先生

ID:shouwangxiansheng

前言

经常有读者让我推荐书籍,这次我就把我私藏的计算机书单分享给你们!不过由于时间匆忙,不会进行更加详细…

博文

漫话:什么是 https ?这应该是全网把 https 讲的最好的一篇文章了

10-26 阅读数 3万+

一、对称加密

一禅:在每次发送真实数据之前,服务器先生成一把密钥,然后先把密钥传输给客户端。之后服务器给客…

博文

HTML CSS整理笔记

10-26 阅读数 1万+

博文

史上最全的mysql基础教程

10-28 阅读数 1万+

启动mysql服务

sudo /usr/local/mysql/support-files/mysql.server start
停止mysql服务
sudo /usr/loc…
博文

为什么你学不会递归?告别递归,谈谈我的经验

10-28 阅读数 2万+

博文

大学四年,分享看过的优质书籍

10-27 阅读数 2万+

博文

有哪些让程序员受益终生的建议

10-28 阅读数 4万+

敲黑板!!!读了这篇文章,你将知道如何才能进大厂,如何实现财务自…

博文

史上最全正则表达式语法,文末附常用表达式!

10-28 阅读数 5945

一、元字符

元字符是构造正则表达式的一种基本元素。

. :匹配除换行符以外的任意字符

w:匹配字母或数字或下划线或汉字

s:匹配任意的空白符

d:匹配数字

b:…

博文

最近程序员频繁被抓,如何避免面向监狱编程!?

10-28 阅读数 6万+

博文

一文搞懂什么是TCP/IP协议

10-28 阅读数 2万+

计算机与网络设备之间如果要相互通信,双方就必须基于相同的方法.比如如何探测到通信目标.由哪一边先发起通信,使用哪种语言进行通信,怎样结束通信等规则都需要事先确定.不同的硬件…

博文

大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了

10-28 阅读数 12万+

博文

学习 Java 应该关注哪些网站?

10-28 阅读数 1万+

博文

哪些 Java 知识不需要再学了

10-28 阅读数 1万+

博文

大学四年,我把私藏的自学「学习网站/实用工具」都贡献出来了

10-29 阅读数 5万+

博文

中国麻将:世界上最早的区块链项目

10-29 阅读数 4万+

最近区块链这个玩意又被市场搞的很是火热,相信大部分人都不太清楚这玩意到底是怎么样的一个概念,它来了,它来了,它到底是啥~ 国家都开始发文支持了,下面是一个通俗易懂的…

博文

比特币原理详解

10-29 阅读数 2万+

比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是…

博文

Python 基础(一):入门必备知识

10-30 阅读数 1万+

博文

Java基础中的IO流

11-19 阅读数 1701

博文

兼职程序员一般可以从什么平台接私活?

10-31 阅读数 4万+

根据我们的经验,程序员兼职主要分为三种:兼职职位众包、项目整包和自由职业者驻场。

所谓的兼职职位众…

博文

Ngrok: 超简单的内网穿透,了解一下 ?

10-31 阅读数 6629

首先,我们生活中的网络从应用上可以分为内网和外网;

内网就是你自己的网络环境,就你自己能访问,比如你本地测试进行的localhost;

外网就不言而喻了,你看网页,视频等…

博文

Python十大装B语法

11-02 阅读数 4万+

博文

求小姐姐抠图竟遭白眼?痛定思痛,我决定用 Python 自力更生!

11-06 阅读数 619

博文

提前送给双十一单身猿们的表白神器

11-07 阅读数 1万+

博文

python学习目录

11-07 阅读数 7166

二、Python运算符、条件结构、循环结构

三、Python函数

四、做一次综合练习,做一个控制台…

博文

刷了几千道算法题,这些我私藏的刷题网站都在这里了!

11-08 阅读数 2万+

然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交…

博文

JavaScript 为什么能活到现在?

11-08 阅读数 1496

责编 |郭芮

出品 | CSDN(ID:CSDNnews)

JavaScript能发展到现在的程度已经经历不少的坎坷,早产带来的某些缺陷是永久性的,因此浏览器才有禁用Ja…

博文

别翻了,这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析【JVM篇二】

11-21 阅读数 5581

博文

项目中的if else太多了,该怎么重构?

11-11 阅读数 9079

博文

没有更多推荐了,返回首页

©️2019 CSDN
皮肤主题: 编程工作室
设计师: CSDN官方博客

最新文章

分类专栏

归档

最新评论

  • 建立myisam的时候,截图里面engine=myisam写成了engine=innoDB

  • 是大小写的问题?看清楚了?

  • 配色有点。。

  • [reply]xieqinzhangjian[/reply] 你等会?大小写这么重要么?

  • 文章写错了,建立MyISAM表的时候用了Myisam了

你可能感兴趣的文章
Android设置默认Launcher
查看>>
Android判断GPS是否开启和强制帮用户打开GPS
查看>>
Android Studio中通过快捷键来提取提取方法
查看>>
和喜欢的女生聊天 15 分钟以后就找不到话题了怎么办?
查看>>
安卓4.0响应鼠标左右点击事件
查看>>
自定义dialog的布局样式
查看>>
android 之输入法
查看>>
Android4.0之后添加虚拟按键方法
查看>>
将自定义输入法设置为系统默认输入法
查看>>
Android Studio大课堂 - 6.2.打包 - 友盟多渠道包示例
查看>>
实用的欢迎页开源库 AppIntro
查看>>
Windows使用VNC viewer访问Ubuntu 14.04远程桌面的简单方法
查看>>
Android编译大全(六)
查看>>
TVS测试波形比较,让您更懂TVS
查看>>
yum安装对于下载总是失败的rpm包如何处理
查看>>
快速由PCI迁移到PCIe
查看>>
CCD和CMOS图像传感器的快门
查看>>
视频跟踪算法
查看>>
图像处理技术在视频监视中的应用
查看>>
DM8168 HDVPSS中的显示输出
查看>>