【MYSQL】MySQL整体结构

无论你是前端还是后端,只要是一个合格的开发者,对于MySQL这个名词相信都不陌生,MySQL逐渐成为了最受欢迎的关系型数据库,无论你是大前端,亦或是Java、Go、Python、C/C++、PHP....等这些语言的程序员,对于MySQL是必然要掌握的核心技术之一,程序员不能没有MySQL,就像西方不能失去耶路撒冷一般。

   当然,MySQL也不仅仅是唯一的数据库,与它类似的关系型数据库竞品还有很多,例如Oracle、SQLServer、PostgreSQL、DB2....,这其中使用最为广泛的是Oracle,但Oracle实际上并不怎么受程序员欢迎,或者说Oracle并不怎么受中小企业的Boss欢迎,原因嘛大家都清楚,无非因为它收费罢了。

也正是由于Oracle收费的原因,才导致MySQL像如今这么流行,正所谓时势造英雄,MySQL作为免费的开源数据库,也正是抓住了这个风口,所以才越发流行。对于MySQL,用一句话形容很贴切:“天不生我MySQL,编程万古如长夜”。

一、MySQL概述与系列预告

MySQL数据库是由瑞典的MySQL AB公司开发的,后面这家企业被Sun公司收购,最后Sun公司又被Oracle74亿美元收购,所以本质上MySQL现在隶属于Oracle旗下,因此大家也会发现,MySQL后面的高版本会有收费版出现。

实际上如果MySQL没有并入Oracle的话,是有很大几率问鼎数据库榜首的,造化弄人。

整个MySQL系列会按上述目录进行全面阐述,但上述目录只是预期规划内容,实际撰写过程中可能会适当调整,但给出的技术点都会事无巨细的讲到,内容只多不少,因此大家感兴趣的话,可以点个关注,由我伴随诸君一同彻底掌握MySQL数据库。

二、MySQL整体结构浅析

   本章作为MySQL系列的开篇之作,当然也有一定的原因,毕竟只有先对MySQL的整体架构有了一个宏观的认知,才能更好的理解每个细节点的知识。

   MySQL与我们开发项目时相同,为了能够合理的规划整体架构设计,也会将整个MySQL服务抽象成几个大的模块,然后在内部进行实现,因此先来看看MySQL的整体架构,开局先上一张图:

从上往下看,依次会分为网络连接层、系统服务层、存储引擎层、以及文件系统层,往往编写SQL后,都会遵守着MySQL的这个架构往下走。

  • 连接层:主要是指数据库连接池,会负责处理所有客户端接入的工作。
  • 服务层:主要包含SQL接口、解析器、优化器以及缓存缓冲区四块区域。
  • 存储引擎层:这里是指MySQL支持的各大存储引擎,如InnoDB、MyISAM等。
  • 文件系统层:涵盖了所有的日志,以及数据、索引文件,位于系统硬盘上。

OK~,除了上述的四层外,还有客户端,这个客户端可以是各类编程语言,如Java、Go、Python、C/C++、PHP、Node、.Net....,也可以是一些数据库的可视化软件,例如Navicat、SQLyog等,也可以是mysql-cli命令行工具。总之,只要能与MySQL建立网络连接,都可以被称为是MySQL的客户端。

MySQL-Server就是上述图中的那玩意儿,一般来说,客户端负责编写SQL,而服务端则负责SQL的执行与数据的存储。

MySQL的整体架构有了简单了解后,接下来详细的拆解一下MySQL-Server的每个层面。

三、网络连接层

   在之前的《网络之旅》的文章中,我们提到过一点:当一个客户端尝试与MySQL建立连接时,MySQL内部都会派发一条线程负责处理该客户端接下来的所有工作。而数据库的连接层负责的就是所有客户端的接入工作,MySQL的连接一般都是基于TCP/IP协议建立网络连接,因此凡是可以支持TCP/IP的语言,几乎都能与MySQL建立连接。

其实MySQL还支持另一种连接方式,就是Unix系统下的Socket直连,但这种方式一般使用的较少。

   虽然MySQL是基于TCP/IP协议栈实现的连接建立工作,但并非使用HTTP协议建立连接的,一般建立连接的具体协议,都会根据不同的客户端实现,如jdbc、odbc...这类的。在这里先暂且不纠结连接MySQL时的协议类型,先来看看一般是怎么连接MySQL的?如下:

mysql -h 127.0.0.1 -uroot -p123456

例如上述这条指令,-h表示MySQL所在的服务器IP地址,-u表示本次连接所使用的用户名,-p则代表着当前用户的账号密码,当执行这条指令后,会与MySQL-Server建立网络连接,也就是会经历《TCP的三次握手过程》。当然,MySQL也支持SSL加密连接,如果采用这种方式建立连接,那还会经过《SSL多次握手过程》,当握手结束,网络建立成功后,则会开始正式的数据库连接建立工作。

TCP网络连接建立成功后,MySQL服务端与客户端之间会建立一个session会话,紧接着会对登录的用户名和密码进行效验,MySQL首先会查询自身的用户表信息,判断输入的用户名是否存在,如果存在则会判断输入的密码是否正确,如若密码错误或用户名不存在就会返回1045的错误码,如下信息:

ERROR 1045 (28000): Access denied for user 'zhuzi'@'localhost' (using password: YES)

如果你在连接数据库的过程中,出现了上述的错误信息,那绝对是你输入的用户名或密码错误导致的,当账号及密码正确时,此时就会进入MySQL的命令行,接下来可以执行SQL操作。

但实际上,在用户名和密码都正确的情况下,MySQL还会做一些些小动作,也就是会进行授权操作,查询每个用户所拥有的权限,并对其授权,后续SQL执行时,都会先判断是否具备执行相应SQL语句的权限,然后再执行。

OK~,经过上述流程后数据库连接就建立成功了,数据库连接建立成功后,MySQL与客户端之间会采用半双工的通讯机制工作,与之对应的还有“全双工、单工”的工作模式:

  • 全双工:代表通讯的双方在同一时间内,即可以发送数据,也可以接收数据。
  • 半双工:代表同一时刻内,单方要么只能发送数据,要么只能接受数据。
  • 单工:当前连接只能发送数据或只能接收数据,也就是“单向类型的通道”。

到这里,MySQL也会“安排”一条线程维护当前客户端的连接,这条线程也会时刻标识着当前连接在干什么工作,可以通过show processlist;命令查询所有正在运行的线程:

执行结果如下(root账号可以查询所有线程):

  • Id:当前线程的ID值,可以利用这个ID,使用kill强杀线程。
  • User:当前线程维护的数据库连接,与之对应的用户是谁。
  • Host:与当前线程保持连接关系的客户端地址(IP+Port)。
  • db:目前线程在哪个数据库中执行SQL
  • Command:当前线程正在执行的SQL类型,如:
    • Create DB:正在执行创建数据库的操作。
    • Drop DB:正在执行删除数据库的操作。
    • Execute:正在执行预编译的SQLPreparedStatement)。
    • Close Stmt:正在关闭一个PreparedStatement
    • Query:正在执行普通的SQL语句。
    • Sleep:正在等待客户端发送SQL语句。
    • Quit:当前客户端正在退出连接。
    • Shutdown:正在关闭MySQL服务端。
  • Time:表示当前线程处于目前状态的时间,单位是秒。
  • State:表示当前线程的状态,有如下几种:
    • Updating:当前正在执行update语句,匹配数据做修改操作。
    • Sleeping:正在等待客户端发送新的SQL语句。
    • Starting:目前正在处理客户端的请求。
    • Checking table:目前正在表中查询数据。
    • Locked:当前线程被阻塞,其他线程获取了执行需要的锁资源。
    • Sending Data:目前执行完成了Select语句,正在将结果返回给客户端。
  • Info:一般记录当前线程正在执行的SQL,默认显示前一百个字符,查看完整的SQL可以使用show full processlist;命令。

其实从这个结果上来看,我们能够很明显的看到数据库中各个线程的信息,这条指令对于以后做线上排查时有很大的作用,目前先简单了解,接着来看看数据库连接池。

3.1、数据库连接池(Connection Pool)

   Connection Pool翻译过来的意思就是连接池,那为什么需要有这个东西呢?因为前面聊到过,所有的客户端连接都需要一条线程去维护,而线程资源无论在哪里都属于宝贵资源,因此不可能无限量创建,所以这里的连接池就相当于Tomcat中的线程池,主要是为了复用线程、管理线程以及限制最大连接数的。

   连接池的最大线程数可以通过参数max-connections来控制,如果到来的客户端连接超出该值时,新到来的连接都会被拒绝,关于最大连接数的一些命令主要有两条:

  • show variables like '%max_connections%';:查询目前DB的最大连接数。
  • set GLOBAL max_connections = 200;:修改数据库的最大连接数为指定值。

对于不同的机器配置,可以适当的调整连接池的最大连接数大小,以此可以在一定程度上提升数据库的性能。除了可以查询最大连接数外,MySQL本身还会对客户端的连接数进行统计,对于这点可以通过命令show status like "Threads%";查询:

其中各个字段的释义如下:

  • Threads_cached:目前空闲的数据库连接数。
  • Threads_connected:当前数据库存活的数据库连接数。
  • Threads_createdMySQL-Server运行至今,累计创建的连接数。
  • Threads_running:目前正在执行的数据库连接数。

对于几个字段很容易理解,额外要说明的一点是Threads_cached这个字段,从名称上来看,似乎跟缓存有关系,其实也没错,因为这里是有一个数据库内部的优化机制。当一个客户端连接断开后,对于数据库连接却不会立马销毁,而是会先放入到一个缓存连接池当中。这样就能在下次新连接到来时,省去了创建线程、分配栈空间等一系列动作,但这个值不会是无限大的,一般都在32左右。

连接池的优化思想与Java线程池相同,会将数据库创建出的连接对象放入到一个池中,一旦出现新的访问请求会复用这些连接,一方面提升了性能,第二方面还节省了一定程度上的资源开销。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据入门之如何利用Phoenix访问Hbase

在大数据的世界里,HBase和Phoenix可谓是一对黄金搭档。HBase以其高效的列式存储和强大的数据扩展能力,成为大数据存储领域的佼佼者;而Phoenix则以其SQL化的操作方式,简化了对HBase的访问过程。今天,就让我们一起看看如…

是时候开启Copilot下一篇章:Microsoft AI

微软总裁兼首席执行官萨提亚纳德拉欢迎 Mustafa Suleyman 和 Karn Simonyan 加入微软公司,领导一个新成立的部门 —— Microsoft AI,旨在开发 Copilot 和其他的面向消费者的 AI 产品和研究。 Mustafa Suleyman 将担任 Microsoft AI 执行副总裁&#xf…

Freecad参数化三维建模的趋势——水利水电设计

最近以chatgpt3.5彻底放开和Kimi小程序如此方便使用而火爆。 三维参数化模型是一个趋势,特别对于这些常规的建筑物设计,基本极少各种曲线曲面,所以特别适合做参数化。 而水利水电工程上应用的设备和产品,也可以建立参数化库&…

展厅装修设计中合理的使用颜色

一、选择合适的主题是最重要的一点 一个引人注目的主题可以立即吸引到游客的注意力,成功的将展厅的主题和产品联系在一起。这个主题应该是与你的产品或服务密切相关的,同时又足够具有吸引力,以吸引消费者对你的展厅产生好奇心。 二、合理的使…

动态规划——记忆化搜索DP

以901. 滑雪 - AcWing题库为例 记忆化搜索和DFS: DFS:在某个方向上滑雪滑倒不能滑为止,然后再回溯继续滑,直到以所有点为起始点全部遍历完 记忆化搜索:用f[i,j]记录,以某点开始滑的最大路径,保证…

【YUNBEE云贝-进阶课】MySQL8.0性能优化实战培训

众多已经学习过MySQL 8.0 OCP认证专家的课程的同学们对 MySQL 8.0 的安装部署、体系结构、配置监控、用户管理、主从复制、系统运维、MGR等基础操作和动手实验有了一定的学习基础.很多学员反馈希望更进一步提升技术能力、解决工作中碰到的性能问题。 针对MySQL8.0的数据库性能优…

JetBrains PhpStorm 2024.1 发布 - 高效智能的 PHP IDE

JetBrains PhpStorm 2024.1 发布 - 高效智能的 PHP IDE 请访问原文链接:JetBrains PhpStorm 2024.1 (macOS, Linux, Windows) - 高效智能的 PHP IDE,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org JetBrains PhpSt…

构建智能连接的未来:物联网平台系统架构解析

随着科技的不断进步和互联网的普及,物联网(Internet of Things, IoT)已成为连接世界的新方式。物联网平台作为实现物联网应用的核心基础设施,其系统架构的设计和实施至关重要。本文将深入探讨物联网平台系统架构的关键要素和最佳实…

建造者模式:构造复杂对象的艺术

在面向对象的设计中,建造者模式是一种重要的创建型设计模式,专门用来构建复杂的对象。它主要目的是将对象的构造代码与其表示代码分离,使同样的构建过程可以创建不同的表示。本文将详细介绍建造者模式的定义、实现、应用场景以及优缺点&#…

EasyConnect初始化失败如何解决?

使用EasyConnect for mac的用户是不是会经常出现这样的提示:“初始化失败,请尝试重新安 装”? 重新下载安装后,第一次使用是没有问题的,但是第二次使用还是会出现这样的情况。 那么怎么一劳永逸地解决这个问题呢&am…

FluentUI系列 - 1 - 介绍第一个窗口

介绍一个QML的UI库,国人编写,作者也耍知乎。这个UI库确实好用,但是教程基本等于无,个人在使用中顺便记录一下学习内容。这玩意儿也有Pyside6的版本,有需要的可以查看PySide6-FluentUI-QML。 FluentUI库地址​github.c…

SpringMVC--02--上下文工具类(RequestContextHolder)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 RequestContextHolder背景1.RequestContextHolder的使用2.request和response怎么和当前请求挂钩?3.request和response等是什么时候设置进去的? 案例应用---用户信…

softmax回归:多分类问题的解码器

随着人工智能技术的不断发展,分类问题在机器学习领域中的地位日益凸显。在众多分类算法中,softmax回归以其独特的优势和广泛的应用场景,成为了处理多分类问题的有力工具。本文将深入探讨softmax回归的原理、应用及其优缺点,以期为…

【好用】推荐10套后端管理系统前端模板

后台管理系统前端模板是开发者在构建后台管理系统时使用的一种工具,它提供了预先设计好的界面和组件,以帮助开发者快速搭建出功能完善、用户体验良好的管理系统。以下是V哥整理的10款流行的后台管理系统前端模板,它们基于不同的技术栈和设计理…

找出mongodb的jumbo块并进行分裂

https://www.cnblogs.com/abclife/p/15968628.html 根据这篇文档中的脚本,在我们自己的环境中跑了下,第一次跑的结果如下: 运行完上面跑出的split脚本后,还是存在jumbo块,第二次跑出的结果: 从上面结果可以…

【Vue3进阶】- 第2学堂小商城项目后端准备和接口文档

简介 在大多数前端项目开发中,都需要与后端进行接口交互,后端通常会以文档的形式提供接口信息,前端开发者通过阅读这些文档,了解后端接口的功能和使用方法,从而实现数据的获取和提交等功能。 第二学堂小商城教程后端…

古月·ROS2入门21讲——学习笔记

第一讲:ROS/ROS2是什么 1. ROS的诞生 对于越来越复杂的智能机器人系统,已经不是一个人或者一个团队可以独立完成的,如何高效开发机器人,是技术层面上非常重要的一个问题,针对这个问题,一群斯坦福大学的有…

CentOS7 boa服务器的搭建和配置

环境是CentOS7,但方法不局限于此版系统,应该是通用的。 具体步骤如下: 1. 下载boa源码 下载地址: Boa Webserver 下载后,进入压缩包所在目录,进行解压: tar xzf boa-0.94.13.tar.gz 2. 安装需要的工具b…

要申请开通融资融券账户,有那些条件?

1、什么是融资融券交易? 融资融券交易,又称信用交易,是指投资者向具有融资融券业务资格的证券公司提供担 保物,借入资金买入交易所上市证券(融资交易)或借入交易所上市证券并卖出(融券交易) 的…

如何在ADS中实现数据的导入和导出

1 MDIF接口 ADS提供了一种通用的MDIF格式文件,允许用户使用一个通用的数据接口实现导入和导出的功能,其Help文件中的简介如下: 2 数据的导入 实现数据导入功能之前,数据必须遵从一定的标准格式,如下图所示,…