mysql底层解析——连接层,包括连接、解析、缓存、引擎、存储等

news2024/11/15 15:29:46

1、 前言

打算写一个系列的文章,主要是mysql底层解析。

很多时候,程序员对mysql处于频繁使用,但都一知半解的程度,除了会加个索引,貌似也没啥优化的技能了。事实上,mysql能有今日的成就,必然不是靠个索引就吃饭的。更何况很多情况下,索引什么的应用层面也解决不了实际问题。那么,我们就需要深入到mysql内部去一探究竟。

分层架构
在这里插入图片描述
大多数数据库都是这样的结构,mysql作为一个插件式的数据库,在存储层支持多种引擎,譬如默认的innodb,和之前版本默认的MyIsam。存储层相对来说还比较好理解,由不同的引擎提供相同的接口给server层调用,来完成数据的增删改查。

server层是mysql比较复杂的地方,里面包含了大量的逻辑,譬如语义分析、查询优化、日志、缓存等等。

网络层就比较简单一些,就是提供socket连接的地方。

网络层
在mysql的网络层,我们主要关注3个地方

1 》Poll、Select模型

2》 Max-connections

3》 connection复用

mysql在启动后,创建了socket server,绑定了3306端口,并对其进行监听。和java里的写法类似,用一个while循环来监听新来的connection,如果有了新连接,就创建一个新的连接线程去处理(不能超过max-connections)。

这种就是典型的BIO的模式,为每一个连接创建一个线程。并且,mysql在这里采用了IO多路复用,会有一个if语句来判断当前系统是否支持Poll模式,否则就走Select模型(各个系统默认都有实现)。

Poll模型和Select非常类似,只是少了1024个fd的限制,都是采用遍历数组轮询有没有新IO事件的方式,在连接数较少的情况下,性能优异,要好于epoll。

关于BIO和poll、select、epoll,如果不太了解,可以看这一篇。

mysql基于BIO,本质上是不接受大量的socket连接的,原因懂BIO的都知道,所以设置了max-connections这个限制,超过设置的max,那么新来的连接会被拒绝。那么,我们迎来了第一个问题,为什么是BIO,而不是可以承受更大连接数的NIO和AIO呢?是否用NIO就会更好呢?

mysql的BIO
先来看看bio和nio的区别,在BIO模式下,调用read,如果发现没数据,就会Block住。在NIO模式下,调用read,如果发现没数据,就会立刻返回-1, 并且errno被设为EAGAIN。

做server开发的都知道,tomcat、netty之类的web服务器,都是基于NIO+IO多路复用的模式,来大幅提升性能,承载高并发访问的。但是到了DB层,就变成了hakiri、druid之类的线程池,开启10个线程去连接mysql,反复复用这个线程池。

首先要理解一个概念,NIO+IO多路复用并不是指多个用户socket共享一个IO,从而使得服务端的socket数量大减。而是把多个socket连接,归并到一个进程进行管理,譬如用一个大数组来聚合起来,然后循环遍历这个数组,来一次性把多个连接的事件通知业务代码进行处理。这个很好理解,之前是给每个孩子分配一个老师,孩子没事时,老师也跟着闲着等待。现在是,把一大堆孩子归一个老师管,老师每次都从头到尾问一遍,有没有事,有事了再处理。这样就大幅减少了server的压力,高效利用资源。

对mysql来说,一般都会有多个连接,毕竟并发肯定是要有的。不可能做个查询,也要大家一起排队等上一个人查询完。所以线程池和并发是一定的。

mysql和web Server有一个重大区别,一个Web请求,往往是无状态的,一问一答的时候居多,请求也往往比较短促,对于顺序性也不是十分严格,哪怕是后请求的响应比先请求的提前到,也是有可能的。而DB就不一样了,DB采用session作为一个连接会话,这一个session里,SQL的执行必须是串行、同步、有序的,而不能是异步乱序的。原因都明白,一个session内可能有多个操作,增删改查、事务隔离,必须保证顺序不能乱。DB维护这样一个session,是要花费远大于web Server处理一个请求的资源才能完成的。

那么对于DB来说,连接是非常耗资源的事情,限制连接数是非常有必要的。绝不是平时当你连接mysql出问题时,就听别人的,随便加大应用服务的连接池和增大mysql的max-connection。往往你做的这些,不能改善mysql的性能。后面会有例子,来讲当进行非常密集的数据库操作时,连接池的数量对性能产生的巨大影响。

扯了这么多,貌似没有讲为什么用BIO,而不是NIO。

原因很简单,JDBC不支持,JDBC出现了20年了,它是一个标准,在它被提出时,只有BIO模型一家,还没有别的IO呢,你用个毛线。各家数据库驱动对JDBC的实现都是BIO的形式,你的mysql驱动connector早早地实现了JDBC标准,就是采用阻塞的方式。当你进行一个select查询,在查询没有完成之前,整个调用线程会被卡住,等到天荒地老也要等下去,绝不是一请求立马收到返回,然后等mysql回调你结果。

民间也有人修改了mysql的协议,增加了NIO+多路复用的功能,但是本身形不成气候,根本原因还是mysql和web server功能意义都不一样,确切地说,90%的场景下,你不需要一个NIO的数据库。

BIO+连接池已经发展了很多年,大部分问题都已经解决,在目前的java环境中,是非常靠谱的方案。已经出现了很多优秀的连接池框架,你只需要配置好账号密码和连接池数量,就能很开心的使用mysql了。

而从mysql的角度来说,客户端多是一些IO密集型的应用,在一个线程里频繁做大量IO操作,而不是说有巨多的客户端来反复连接我。毕竟,mysql的用户是你写的几个程序应用,而web server的用户是千千万的吃瓜群众。

连接池
mysql能支撑的连接数是有限的,那么就需要应用程序来利用好连接池。对于连接池来说,就是做好这10个连接的管理就好。

对于mysql来说,管理好自己的所有连接也是很重要,哪些空闲的该休息就休息,让出资源,该复用就复用,避免创建太多线程。

要记住一个基本原则,IO密集的时候,要减少连接数。譬如你要读写几千万数据,非常密集的IO操作,那么你可以尝试一下开启少量的mysql连接(和cpu的核数相同)和开启大量的连接(成百上千),来做同样的事。你会发现,更少的连接数,会给你带来几百倍的性能提升。

原因也很简单,你有4辆车(4核),要从仓库里拉一大堆货物到另一个地方。如果只有4条路,那么很简单,一个车走一路,反复折返跑就是了。现在有了100条路,你还是4个车,你的车要频繁的在100条路上来回切换,每条路都必须要走到,你说哪个快。

线程间的轮转会耗费大量的资源,尤其在密集操作时。但是当不密集时,情况就变了,大量的线程处于休息状态,那么你即便多开了几个连接,CPU还是能很快的照顾到你,并没有什么大的影响。

网络协议
这个就不多说了,作为RPC的连接,肯定是要有个自己的协议的,mysql作为数据库肯定是不能用http那种比较臃肿的方式。那么就有自己的rpc数据协议,收发两端做好解码转码就好了,对用户是透明的。

这一篇主要讲网络层,对于网络层相对比较简单,需要关注的也主要是连接数。

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

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

相关文章

Selenium4新特性-关联定位策略

Selenium 4 引入了关联元素定位策略(Relative Locators)。这种方式主要是应对一些不好定位的元素,但是其周边相关联的元素比较好定位。实现步骤是先定位周边较容易定位的元素,再根据关联元素定位策略定位到想定位的那个元素。如下以具体案例讲解用法。 以…

UDS诊断系列介绍15-FIM模块功能介绍

本文框架1. 系列介绍1.1 FIM模块概述2. FIM相关概念2.1 FID概念2.2 FIM数据结构3. FIM模块作用过程4. Autosar系列文章快速链接1. 系列介绍 UDS(Unified Diagnostic Services)协议,即统一的诊断服务,是面向整车所有ECU的一种诊断…

English Learning - L1-13 主动脉修饰 (上) 2023.1.16 周一

English Learning - L1-13 主动脉修饰 (上) 2023.1.16 周一11 主动脉修饰11.1 定语两大核心when 引导的定语从句where 引导的定语从句为什么有时关系词前会有介词到底用 which 还是用 that ?1. 先行词是 all, much, little, few, the one 等不定代词&a…

Java---微服务---SpringCloud(1)

SpringCloud011.认识微服务1.0.学习目标1.1.单体架构1.2.分布式架构1.3.微服务1.4.微服务技术对比1.5.SpringCloud1.6.总结2.服务拆分和远程调用2.1.服务拆分原则2.2.服务拆分示例2.2.1.导入Sql语句2.2.2.导入demo工程2.3.实现远程调用案例2.3.1.案例需求:2.3.2.注册…

如何使用Facebook Insights提升SEO策略

搜索流量是所有网站都必须考虑的重要因素,但如何才能吸引到更多的访问者呢?我们都知道 Google的 SEO算法,那 Google针对搜索流量的算法有哪些?Facebook Insights (Facebook Search Engine Insight)是一款搜…

基于python个性化推荐购物系统的设计与实现

源码获取:https://www.bilibili.com/video/BV1Ne4y1g7dC/ 一、开发工具及技术 Python3.6.8,Django3,mysql8,navicat数据库管理工具,html页面,javascript脚本,jquery脚本,bootstrap…

从零实现一个组件库(一)项目环境搭建

文章目录前言monorepo架构1.monorepo架构的优势2.使用pnpm搭建monorepo架构(1)全局安装pnpm(2)初始化项目(3)新建workspace.yaml文件4.不同包之间的相互引用TypeScript支持1.安装TypeScript2.初始化TypeScr…

6、工程和模块管理

文章目录6、工程和模块管理6.1 IDEA 项目结构6.2 Project和Modoule的概念6.3 创建模块6.4 删除模块6.5 导入别人的模块6.6 当导入的模块字符集问题,导致中文乱码6.7 同时打开两个IDEA项目工程1 新建一个IDEA项目2 两个IDEA项目工程效果3 打开两个IDEA项目【尚硅谷】…

Kubernetes:开源 K8s 管理工具 Rancher 认知

写在前面 博文内容涉及Rancher 的介绍,集群内安装查看 Rancher 的基本功能理解不足小伙伴帮忙指正 我所渴求的,無非是將心中脫穎語出的本性付諸生活,為何竟如此艱難呢 ------赫尔曼黑塞《德米安》 Rancher 介绍 Rancher 是一个 Kubernetes 管…

计算机基础——python数据结构之顺序表和链表

计算机基础——数据结构概述数据结构算法时间复杂度python的代码执行时间测量模块线性表顺序表顺序表的连续存储顺序表的两种基本实现方式链表单向链表顺序表和单链表的对比双向链表单向循环链表概述 数据是信息的载体,是描述客观师傅属性的数、字符以及所有能输入…

抖音小黄车挂淘宝店相关问题记录

不开淘宝店,但作为技术被客户问起来,总得知道个一二,今天研究了一下,大致情况如下: 抖音绑定淘宝推广id 大致流程就是抖音开通橱窗,橱窗和淘宝挂钩,淘宝商品引入橱窗。 首先要满足抖音要求&a…

AlmaLinux 9 安装Oracle GraalVM Enterprise Edition 21.3.x

今天我们尝试一下在AlmaLinux 9 安装Oracle GraalVM Enterprise Edition 21.3.x。 GraalVM Enterprise 21 是一个 Long-Term-Support (LTS) 版本。 注意:下载Oracle GraalVM Enterprise Edition需要有Oracle账户,如果没有,可以通过访问创建您…

【SpringCloud】Nacos注册中心、配置中心用法与原理(上)

【SpringCloud】Nacos注册中心、配置中心用法与原理(上) 一、Nacos注册中心 1. 安装Nacos 【BUG】请注意Nacos2.0版本与1.0版本是有差别的! 2. Nacos的服务注册使用样例 (1)引入依赖 (2)配…

PowerShell 学习笔记

一、PowerShell 强大之处使用方便面向对象使用.net平台功能兼容性好(兼容CMD等)可扩展性好二、快捷键Tab:自动补齐命令或者文件名三、管道和重定向管道:上条命令的输出作为下一条命令的输入举例如下:列出当前目录ls结果…

FPGA 20个例程篇:19.OV7725摄像头实时采集送HDMI显示(四)

第七章 实战项目提升,完善简历 19.OV7725摄像头实时采集送HDMI显示(四) 在介绍完OV7725初始化配置和视频采集模块后,就到了整个项目的核心部分即DDR3乒乓存储图像模块,为了实现整个FPGA项目工程当中良好的实时性&…

会议论文分享-FSE20-基于学习的状态修剪策略

基于学习的状态修剪策略1.引言2.Homi算法2.1.概率修剪策略2.2.Homi2.2.1.Collecting Promising Data2.2.2.Generating Features.2.2.3.Learning Distribution2.2.4.Sampling Values2.2.5.总结3.实验3.1.实验设置3.2.有效性3.3.候选状态数量3.4.与朴素方法的对比4.代码实操4.1.代…

5、IDEA详细配置

文章目录5、IDEA详细配置5.1 如果打开详细设置界面5.2 系统设置1 默认启动项目配置2 取消自动更新5.3 设置整体主题1 选择主题2 设置菜单和窗口字体大小3 设置IDEA背景图5.4 设置编辑器主题样式1 编辑器主题2 字体大小3 注释的字体颜色5.5 显示行号与方法分隔符5.6 代码智能提示…

2023mac电脑系统第三方清理软件CleanMyMacX

认识 CleanMyMac X 4.12.2! 此版本有哪些亮眼的更新? “更新程序”模块之前曾出现重复推送已安装更新的情况。 小的可用性问题。 任何一部电子设备在使用多年之后都会出现性能下降的问题,苹果的Mac计算机自然也不例外。当你发现Mac运行缓慢&#xff…

Tkinter的Menu与Messagebox

菜单控件Menu 在当前界面的左上角创建一个菜单,可创建二级菜单、三级菜单等等 具体语法: 创建一个菜单,并命名为menu menutkinter.Menu(root) 创建menu菜单的列表,并命名为filemenu filemenutkinter.Menu(menu,tearoff0) 在…

jar包导入失败/配置国内源的方法

注意:idea 的settings分为当前项目设置和新建项目设置两个部分,注意一些设置这两个地方都要调整。下面的步骤 修改好settings后,new projects 里的settings也要同样方法进行修改Maven中央仓库默认使用的是国外的,而国外访问速度很慢&#xff…