MySQL数据库的连接池

现在我们已经知道,我们任何一个系统都会有一个数据库连接池去访问数据库,也就是说这个系统会有多个数据库连接,供多线程并发的使用。同时我们可能会有多个系统同时去访问一个数据库,这都是有可能的。

所以当我们把目光转移到MySQL的时候,我们要来思考一个问题,那就是肯定会有很多系统要与MySQL数据库建立很多个连接,那么MySQL也必然要维护与系统之间的多个连接,所以 MySQL 架构体系中的第一个环节,就是连接池。

我们看下面的图,实际上MySQL中的连接池就是维护了与系统之间的多个数据库连接。除此之外,你的系统每次跟MySQL建立连接的时候,还会根据你传递过来的账号和密码,进行账号密码的验证,库表权限的验证。

网络连接必须让线程来处理

现在假设我们的数据库服务器的连接池中的某个连接接收到了网络请求,假设就是一条SQL语句,那么大家先思考一个问题,谁负责从这个连接中去监听网络请求?谁负责从网络连接里把请求数据读取出来?

我想很多人恐怕都没思考过这个问题,但是如果大家对计算机基础知识有一个简单了解的话,应该或多或少知道一点,那就是网络连接必须得分配给一个线程去进行处理,由一个线程来监听请求以及读取请求数据,比如从网络连接中读取和解析出来一条我们的系统发送过去的SQL语句,如下图所示:

SQL接口:负责处理接收到的SQL语句

MySQL 内部首先提供了一个组件,就是SQL接口(SQL Interface),他是一套执行SQL语句的接口,专门用于执行我们发送给MySQL的那些增删改查的SQL语句

因此MySQL的工作线程接收到SQL语句之后,就会转交给SQL接口去执行,如下图。

查询解析器:让MySQL能看懂SQL语句

比如我们来举一个例子,现在我们有这么一个SQL语句:

select id,name,age from users where id=1

这个SQL语句,我们用人脑是直接就可以处理一下,只要懂SQL语法的人,立马大家就知道他是什么意思,但是MySQL自己本身也是一个系统,是一个数据库管理系统,他没法直接理解这些SQL语句!

所以此时有一个关键的组件要出场了,那就是 查询解析器

这个查询解析器(Parser)就是负责对SQL语句进行解析的,比如对上面那个SQL语句进行一下拆解,拆解成以下几个部分:

1.我们现在要从“users”表里查询数据

2.查询“id”字段的值等于1的那行数据

3.对查出来的那行数据要提取里面的“id,name,age”三个字段。

所谓的SQL解析,就是按照既定的SQL语法,对我们按照SQL语法规则编写的SQL语句进行解析,然后理解这个SQL语句要干什么事情,如下图所示:

查询优化器:选择最优的查询路径

当我们通过解析器理解了SQL语句要干什么之后,接着会找查询优化器(Optimizer)来选择一个最优的查询路径。

但是我们可以用一个极为通俗简单的例子,让大家理解一下所谓的最优查询路径是什么。

就用我们刚才讲的那个例子好了,我们现在理解了一个SQL想要干这么一个事儿:我们现在要从“users”表里查询数据,查询“id”字段的值等于1的那行数据,对查出来的那行数据要提取里面的“id,name,age”三个字段。

事是明白了,但是到底应该怎么来实现呢?

你看,要完成这个事儿我们有以下几个查询路径(纯属用于大家理解的例子,不代表真实的MySQL原理,但是通过这个例子,大家肯定能理解所谓最优查询路径的意思)

1.直接定位到“users”表中的“id”字段等于1的一行数据,然后查出来那行数据的“id,name,age”三个字段的值就可以了

2.先把“users”表中的每一行数据的“id,name,age”三个字段的值都查出来,然后从这批数据里过滤出来“id”字段等于1的那行数据的“id,name,age”三个字段

上面这就是一个最简单的SQL语句的两种实现路径,其实我们会发现,要完成这个SQL语句的目标,两个路径都可以做到,但是哪一种更好呢?显然感觉上是第一种查询路径更好一些。

所以查询优化器大概就是干这个的,他会针对你编写的几十行、几百行甚至上千行的复杂SQL语句生成查询路径树,然后从里面选择一条最优的查询路径出来。

相当于他会告诉你,你应该按照一个什么样的步骤和顺序,去执行哪些操作,然后一步一步的把SQL语句就给完成了。

调用存储引擎接口,真正执行SQL语句

最后一步,就是把查询优化器选择的最优查询路径,也就是你到底应该按照一个什么样的顺序和步骤去执行这个SQL语句的计划,把这个计划交给底层的存储引擎去真正的执行。这个存储引擎是MySQL的架构设计中很有特色的一个环节。

不知道大家是否思考过,真正在执行SQL语句的时候,要不然是更新数据,要不然是查询数据,那么数据你觉得存放在哪里?

所以我们来思考一下,假设我们的数据有的存放在内存里,有的存放在磁盘文件里,如下图所示。

那么现在问题来了,我们已经知道一个SQL语句要如何执行了,但是我们现在怎么知道哪些数据在内存里?哪些数据在磁盘里?我们执行的时候是更新内存的数据?还是更新磁盘的数据?我们如果更新磁盘的数据,是先查询哪个磁盘文件,再更新哪个磁盘文件?

所以这个时候就需要存储引擎了,存储引擎其实就是执行SQL语句的,他会按照一定的步骤去查询内存缓存数据,更新磁盘数据,查询磁盘数据,等等,执行诸如此类的一系列的操作,如下图所示。

MySQL的架构设计中,SQL接口、SQL解析器、查询优化器其实都是通用的,他就是一套组件而已。

但是存储引擎的话,他是支持各种各样的存储引擎的,比如我们常见的InnoDB、MyISAM、Memory等等,我们是可以选择使用哪种存储引擎来负责具体的SQL语句执行的。

当然现在MySQL一般都是使用InnoDB存储引擎的,至于存储引擎的原理,后续我们也会深入一步一步分析,大家不必着急。

执行器:根据执行计划调用存储引擎的接口

那么看完存储引擎之后,我们回过头来思考一个问题,存储引擎可以帮助我们去访问内存以及磁盘上的数据,那么是谁来调用存储引擎的接口呢?

其实我们现在还漏了一个执行器的概念,这个执行器会根据优化器选择的执行方案,去调用存储引擎的接口按照一定的顺序和步骤,就把SQL语句的逻辑给执行了。

举个例子,比如执行器可能会先调用存储引擎的一个接口,去获取“users”表中的第一行数据,然后判断一下这个数据的“id”字段的值是否等于我们期望的一个值,如果不是的话,那就继续调用存储引擎的接口,去获取“users”表的下一行数据。

就是基于上述的思路,执行器就会去根据我们的优化器生成的一套执行计划,然后不停的调用存储引擎的各种接口去完成SQL语句的执行计划,大致就是不停的更新或者提取一些数据出来

mysql 存储引擎接口_MySQL 的基础一(连接池, SQL接口, 查询解析器, 查询优化器, 存储引擎接口, 执行器,)...相关推荐

  1. mysql locate不走索引_MySQL 索引——定位并优化慢 SQL

    定位并优化慢查询SQL.png 为什么要学习定位并优化慢查询 SQL 日常开发中,在数据量比较小的表中,SQL 的执行效率可能没什么问题,但是随着表数据量的增加,慢 SQL 可能就会慢慢浮现,因此学习 ...

  2. basicdatasourcefactory mysql_Java基础-DBCP连接池(BasicDataSource类)详解

    Java基础-DBCP连接池(BasicDataSource类)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 实际开发中"获得连接"或"释放资源 ...

  3. mysql请输入一个有效类型的长度值_MySQL数据库基础(三)——SQL语言

    MySQL数据库基础(三)--SQL语言 发布时间:2020-05-19 16:40:05 来源:51CTO 阅读:10596 作者:天山老妖S MySQL数据库基础(三)--SQL语言 一.SQL语 ...

  4. MYSQL数据库字段关联_MySQL数据库基础——操作关系表、连接查询

    MySQL数据库基础入门--day11 一.操作关联表 1.关联关系: 关联关系有:多对一.多对多和一对多. 一对一关联关系可以应用在以下几方面: (1)分割具有很多列的表 (2)由于安全原因而隔离表 ...

  5. mysql第七章课后答案_mysql核心内幕第七章-查询解析与优化器

    查询优化器是指生成查询计划的子系统,该子系统通常完全处于服务器端,根据要参与连接(join)的表.数据读取方式(所殷读取或表扫描)和索引选择等因素制定查询计划.以基于开销的优化器为例,数据库查询优化器 ...

  6. mysql连接代替子查询_MySQL优化之使用连接(join)代替子查询

    使用连接(JOIN)来代替子查询(Sub-Queries) MySQL从4.1开始支持SQL的子查询.这个技术可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询 ...

  7. mysql round 0.1111_听说Mysql你很豪横?-------------分分钟带你玩转SQL高级查询语句(库函数,存储过程)...

    一 .数据库函数 MySQL 数据库函数提供了能够实现各种功能的方法,使我们在查询记录时能够更高效的输出.MySQL 内建了很多函数,常用的包括数学函数.聚合函数.字符串函数和日期时间函数. 1 数学 ...

  8. oracle 连接池sql跟踪,实现SQLServer、MySQL和oracle数据库连接池

    1. org.apache.tomcat.dbcp.dbcp.SQLNestedException:Cannot load JDBC driver class 'com.mysql.jdbc.Driv ...

  9. oracle和mysql登录方式_使用普通方式和连接池方式获取Oracle和Mysql链接

    数据库连接方式 package com.niit.gb.comm; import java.sql.Connection; import java.sql.DriverManager; public ...

最新文章

  1. QIIME1.9.1-2使用Docker运行QIIME
  2. symbol lookup error
  3. 聚美优品 html 资源,跨界整合行业资源 聚美优品向阳而生
  4. 如何使用 Istio 进行多集群部署管理(一)
  5. Python Demo 06 金庸武侠写作风格分析
  6. 写给MongoDB开发者的50条建议Tip11
  7. php 将颜色透明度,css中如何使颜色透明度
  8. 【Python】nltk库使用报错之punkt安装
  9. centos8.4 nginx 问题
  10. php中加载图片淡入淡出,jQuery实现滚动图片淡入淡出功能
  11. SpringCloud+OAuth2+Redis实现的微服务统一认证授权
  12. 用女朋友动态图做微信二维码,小白都会
  13. SAP License:CO生产订单
  14. hdu 1864 最大报销额 模型为简单的01背包
  15. 实现一个定时任务管理器
  16. 驱动开发:实现驱动加载卸载工具
  17. AMI编码规则与HDB3编码规则详解
  18. 最新Web前端经典面试试题及答案-史上最全前端面试题(含答案)
  19. 黑客的滑铁卢——美国大断网全纪实
  20. Constraint of Oracle studing

热门文章

  1. 微信小程序实现时间戳转为时间格式
  2. IOS中的AFNetworking框架的GET参数的使用
  3. 显示数量_SOLIDWORKS 标注螺纹不显示数量?Why
  4. 安装hadoop伪分布式集群心得
  5. 小程序获取用户信息_App自评估指南:小程序也可参考,第三方获取信息需获用户授权...
  6. python中pow_python – 为什么pow(x,y)的时间复杂度为O(1),而x ** y为O(n)?
  7. 解决SwipeRefreshLayout与Banner滑动冲突
  8. 人工蜂群算法python_人工蜂群算法-python实现
  9. java 数据截断_java – 数据截断:第1行的列’标志’的数据太长
  10. java setrequestheader_Java SampleResult.setRequestHeaders方法代码示例