【mysql技术内幕1】mysql基础架构-一条SQL查询语句是如何执行的

文章目录

    • 1 一条SQL查询语句是如何执行的
    • 2 mysql体系结构
    • 3 InnoDB存储引擎
    • 4 总结

1 一条SQL查询语句是如何执行的

​ 通常我们使用数据库,都是将数据库看成一个整体,我们的应用与数据库完全就是通过SQL语句进行交互。大多数开发者很少去了解数据库的内部实现原理,这样也可以完成我们的应用。但是如果遇到一些疑难问题,如查询变慢、死锁、数据库宕机需要恢复数据时,我们就需要对数据库的实现原理有一定的了解,才能解决这些问题。了解一个东西,先鸟瞰其全貌,再一步步深入到内部。

​ 想要了解mysql的基础架构,从最简单的SQL查询语句来分析,当了解了mysql是如何执行一条SQL查询语句后,就基本了解了mysql的基础体系结构。

​ 下面是一条最简单的SQL查询语句:

select * from T where id = 2;

​ 对于应用开发者来说,看到的就是输入一条语句,返回一个结果。下面是mysql的基本架构简单示意图,这条语句会经过这些过程。

image-20210623235853931

​ 大体来说,mysql可以分为server层和存储引擎层。

  • server层包括
  1. 连接器:连接器负责跟客户端建立连接、获取权限、维持和管理连接等。

  2. 查询缓存:建立连接后就应该进行数据的查询。在真正进行数据查询之前,mysql会先到缓存查看,之前是否执行过这条语句,如果执行过,会在缓存中缓存这条查询对应的返回数据,此时可以直接从缓存中获取。如果不在缓存中,则继续后面的流程。

    2.1 大多数情况下不建议使用查询缓存的功能,因为查询缓存弊大于利。查询缓存失效非常频繁,只要有对表的更新操作,这个表上所有的查询缓存就会被清空,因此很有肯能你很费劲地把结果存起来,还没使用就被一个更新操作清空了。对于更新压力大的数据库来说,查询缓存的命中率非常低。mysql8.0以后直接将查询缓存的功能删掉了。

  3. 分析器:如果没有命中缓存,就开始这正的执行查询了。mysql首先会需要对你提交的SQL语句进行校验与分析,看是否是正确的SQL语句。分析器主要包括词法分析、语法分析,后面的文章会对其进行详细的分析。

  4. 优化器:当SQL语句校验成功,没有语法错误,会进行优化器优化,优化器主要是在表里有多个索引的时候决定使用哪个索引,或者在一个语句有多表关联(jion)的时候,决定各个表的连接顺序。

  5. 执行器:mysql通过分析器知道了要做什么,通过优化器知道了要怎么做。于是就进入了执行阶段,开始执行语句。

    1. 执行的开始会先判断你对这个表是否有权限。
    2. 如果有权限则打开表继续执行,执行器会根据表的存储引擎的定义,来调用不同存储引擎的api接口,查询具体的数据。

​ 上面就是一条SQL查询语句的简单执行过程,只是加单的描述了大概的流程,当然里面的细节非常负责,这在后面的文章中会进行一一拆解。

2 mysql体系结构

​ 在了解了上面的一条SQL查询语句的执行流程后,我们再来看下,mysql完整的体系结构是什么样。

image-20210624004803769

​ 从以上mysql的体系结构中可以看出,主要有以下几个部分组成。

  • 连接池组件
  • 管理服务和工具组件
  • SQL接口组件
  • 查询分析器组件
  • 优化器组件
  • 缓冲组件插件式存储引擎
  • 物理文件

​ mysql数据库区别于其他数据库的最重要的一个特点就是其插件式的表存储引擎。mysq插件式的存储引擎架构提供了一系列标准的管理和服务支持,这些标准与存储引擎本身无关,可能是每个数据库系统本身都需要的,如SQL分析器和优化器。存储引擎是底层物理结构的实现,每个存储引擎开发者可以按照自己的意愿来进行开发。

​ 需要特别注意的是,存储引擎是基于表的,而非数据库的。我们最好牢记上面的mysql体系结构,对我们后面深入理解mysql数据库有很大的帮助。

3 InnoDB存储引擎

​ 我们已经大致了解了mysql数据库独有的插件式体系结构,病了解到存储引擎是mysql数据库区别于其他数据库的一个最重要的特性。存储引擎的好处是,每个存储引擎都有各自的特点,能够根据具体的应用建立不同的存储引擎表。我们业务应用开发平时所说的事务、锁、B+树索引等,也都是在存储引擎层实现的。其中InnoDB存储引擎是目前最常用的一种存储引擎,所以我们总是围绕着InnoDB的原理进行讲解。

​ InnoDB存储引擎支持事务,其设计的主要目标是面向在线事务处理的应用(OLTP),其特点是行锁设计、支持外键、并通过使用多版本并发控制支持一致性非锁定读。并且实现了SQL的四种隔离级别。默认为RR(REPEATABLE READ)隔离级别,同时使用next-key locking 的策略来避免幻读(phantom)现象的产生。除此之外,InnoDB存储引擎还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引、预读(read ahead)等高性能和高可用的功能。

​ 对于标准红数据的存储,InnoDB采用聚集(clustered)的方式,因此每张表的存储都是按照主键的顺序进行存放。

4 总结

​ 本文是接下来对mysql数据库拆解,并深入分析的基础,我们主要掌握mysql体系结构的图,把上面的图背下来也行,对后面理解索引、锁、以及mysql优化都有莫大的好处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422663.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

session实现机制_如何理解php session运行机制

php session运行机制就是客户端将session id传入到服务器中,服务器再根据session id找到对应的文件并将其反序列化得到session值,然后保存的时候先序列化再写入今天将要分享的知识点是PHP中的会话运行机制,对于熟悉PHP的开发者来说并不陌生&a…

【MySQL原理解析】01. 一条SQL查询语句是如何执行的

这是【MySQL原理解析】的第一篇文章,MySQL我看了很多的书与教程,对其原理有一定的理解,一直想写一系列的文章来把MySQL的原理给讲清楚,一直没有时间写,今天算是个开头吧。万事开头难,咱们先破了这个开头&am…

【转载】MOS开关(verilog)

MOS开关 一. MOS开关 1. NMOS 源极(d)接Gnd 一般情况下,可认为晶体管受栅极(g)电平VG的控制(control). 1). VGH,源极(s)与漏极(d)接通; 2). VGL,源极(s)与漏极(d)断开. 源极(s)与漏极(d)接通, 则漏极(d)被下拉到Gnd. 2. PMOS 源极(d)接VDD 1)…

【Linux进程、线程、任务调度】二 fork/vfork与写时拷贝 线程的本质 托孤 进程睡眠和等待队列

学习交流加(可免费帮忙下载CSDN资源):个人微信: liu1126137994学习交流资源分享qq群1(已满): 962535112学习交流资源分享qq群2(已满): 780902027学习交流资源…

用Log4Net来记录系统的日志信息

[http://www.cnblogs.com/xhwy/archive/2011/11/25/2263495.html] 几乎所有的大型应用都会有自己的用于跟踪调试的API。因为一旦程序被部署以后,就不太可能再利用专门的调试工具了。然而一个管理员可能需要有一套强大的日志系统来诊断和修复配置上的问题。 经验表明…

扩展插件_Adobe扩展工具插件系列

Adobe系列软件相信大家都已了解到其功能的强大,除了软件之外Adobe系列的插件的功能也是不可忽略的。今天给大家分享的几款Adobe系列超强PS扩展工具,都是一些摄影师、设计师经常用的到的,可以提升不少工作效率,大家千万别错过哦&am…

【Linux进程、线程、任务调度】三 CPU/IO消耗型进程 吞吐率/响应 SCHED_FIFO算法与SCHED_RR算法 SCHED_NORMAL算法和CFS算法 nice与renic chrt

学习交流加(可免费帮忙下载CSDN资源):个人微信: liu1126137994学习交流资源分享qq群1(已满): 962535112学习交流资源分享qq群2(已满): 780902027学习交流资源…

dexpress 流程图_DevExpress控件使用经验总结

DevExpress是一个比较有名的界面控件套件,提供了一系列的界面控件套件的DotNet界面控件。本文主要介绍我在使用DevExpress控件过程中,遇到或者发现的一些问题解决方案,或者也可以所示一些小的经验总结。总体来讲,使用DevExpress控…

UCenter 表结构

Ucenter 数据库表结构说明uc_admins 管理员表数据表说明:管理员相关信息属性说明:uid mediumint(8) -- 用户IDusername char(15) -- 用户名allowadminsetting tinyint(1) --allowadminapp tinyint(1) --allowadminuser tinyint(1) --allowadminbadword t…

Java学习之路整理-技术书从入门到进阶最全50+本(珍藏版 )

学习交流加 个人微信:LyyCoder学习交流资源分享qq群1(已满): 962535112学习交流资源分享qq群2: 780902027一.速读一遍(最好在1~2天内完成) 人的大脑记忆力有限,在一天内快速看完一本…

问题 seata_架构设计 | 基于Seata中间件,微服务模式下事务管理

一、Seata简介1、Seata组件Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata将为用户提供了AT、TCC、SAGA、XA事务模式,为用户打造一站式的分布式解决方案。2、支持模式AT 模式基于支持本地 ACID 事务的关系型数…

Override and Overload (重写和重载)

1)方法的重写overriding和重载overloading是java多态性的不同表现. (2)重写overriding是父类与子类之间的多态性的一种表现,重载是一个类中多态性的表现。如果子类中定义方法与其父类有相同的名称和参数,我们说该方法被…

程序员史诗级必读书单吐血整理四个维度系列80+本书(珍藏版)

互联网行业的特点是变化。若要提高互联网开发的技能,就必须跟上技术发展的步伐。埋首醉心于项目开发与实战,固然能够锤炼自己的开发技巧,却难免受限于经验与学识。 世界上并不存在速成的终南捷径,但阅读好的技术书籍,尤…

示波器1m和50欧姆示阻抗匹配_示波器输入阻抗选1MΩ还是50Ω的详细解析

熟悉示波器的朋友可能都会有过这样的困惑:输入阻抗有1MΩ和50Ω两种,我们到底该如何选择呢?一、传输线想要讲清楚50Ω的由来,我们需要先讲一下传输线。电信号实际上是以电磁波的形式在传输线中传播的。当传输线的尺寸不再远小于电…

前端学习(355):小练习

.已知两个矩形,宽高分别是200200,400400,甲矩形的坐标是x1,y1.乙矩形的坐标是x2,y2. 写出判断条件两个矩形是否相碰撞 <script>x1200;//自己随意定义坐标x2200;y1400;y2400;var boolfalse;//先定义一个布尔值为falseif(x1>x2 && x1<x2400 && y1&g…

Quartus 中快速分配器件管脚

在quartus中分配器件管脚最笨的方法是对于器件手册一个一个的敲进去&#xff0c;这样做如果用到的管脚很好还没有发觉什么不好&#xff0c;但是当用到的器件管脚很多的时候就会发现很麻烦&#xff0c;而且容易出错。接下来我来介绍一种很方便的方法。 首先在txt文档中建立管脚和…

Web前端书单从HTML到JS到AJAX到HTTP从框架到全栈

前言&#xff1a;技术书阅读方法论 一.速读一遍&#xff08;最好在1~2天内完成&#xff09; 人的大脑记忆力有限&#xff0c;在一天内快速看完一本书会在大脑里留下深刻印象&#xff0c;对于之后复习以及总结都会有特别好的作用。 对于每一章的知识&#xff0c;先阅读标题&…

自定义背景_新版快绘精选:自定义背景墙 | 吊顶 | 云渲染滤镜升级

New自定义背景墙没有合适的背景墙样板&#xff1f;你需要一个全世界独一无二&#xff0c;独属于你monent的背景墙&#xff1f;没问题&#xff01;无论是要这样↓还是这样↓快绘都能帮到你&#xff01;-- 请观看视频 --New自定义吊顶除了可以自定义背景墙&#xff0c;新版快绘也…

【C++学习详细教程目录】

学习交流加&#xff08;可免费帮忙下载CSDN资源&#xff09;&#xff1a;个人微信(进微信群加)&#xff1a; LyyCoder学习交流资源分享qq群1&#xff08;已满&#xff09;&#xff1a; 962535112学习交流资源分享qq群2&#xff08;已满&#xff09;&#xff1a; 780902027学习交…

删除开机选择系统

在我的电脑点右键--属性--高级--系统启动,系统失败和调试信息--设置--显示操作系统列表时间,和在需要时显示恢复选项的时间,在前面的小方格里打上构或去掉构就行了. 修改引导分区里面的BOOT.INI文件s C:\boot.ini 将只读属性去掉 [boot loader] timeout30 defaultmulti(0)dis…