作为一个资深CRUD boy,对于mysql想必都比较熟悉。但很多人估计和我一样对于一条简单的sql语句可以熟练的使用,但要问起里面怎么执行的,可能大部分分人就懵逼了。

因此本文就就将分析一下一条基本的sql语句内部是怎么执行的,以此让大家对sql的执行有一个基本的了解。注:本文针对mysql innodb引擎

mysql组成

mysql组成架构图

从图中可以看出,其实mysql总体分为客户端、server端和引擎层三部分。

客户端

负责操作数据库进行各种业务

server端

server端主要包含以下几个部分:连接器、查询缓存、分析器、优化器、执行器

  • 连接器:要想操作mysql,首先需要建立一个连接,连接器主要负责跟客户端建立连接,获取权限,维持和管理连接。一旦一个连接已经建立,即使当前用户名,密码修改了,也不会影响已经建立的连接,只有当这个连接断开后才会使用新的用户名、密码。
  • 查询缓存:缓存大家应该都了解,主要用于加速处理,mysql的查询也添加了缓存,缓存开启关闭等设置可以通过query_cache_type参数进行设置。

mysql> SELECT @@query_cache_type;

+--------------------+ | @@query_cache_type |

+--------------------+ | ON | +--------------------+

query_cache_type有3个值 0代表关闭查询缓存OFF,1代表开启ON,2(DEMAND)代表当sql语句中有SQL_CACHE关键词时才缓存,

如:select SQL_CACHE user_name from users where user_id = '1';

如果开启了缓存,那么连接建立后,查询语句会首先去查询缓存里面查找是否有匹配的查询,如果有则直接把结果返回给客户端,没有找到则继续后面流程。可以看到缓存如果命中则可以节省很多过程,大大提升效率,但我这里其实并不推荐使用查询缓存。
缓存是需要更新的,mysql的查询缓存什么时候更新呢?当对表有更新操作的时候,mysql的查询缓存会全部删掉。由此可以看出,我们在使用mysql的时候更新操作是经常发生的,此时会把所有查询缓存清空,其实这样的话效率就会非常低。当然对于一些数据不怎么变动的表,如一些配置信息表,只是一些查询,很少有变更,使用缓存效率还是比较高的。具体要不要使用就根据自己的业务场景来判断了。Mysql8.0之后已经对查询缓存的功能整体移除掉了

  • 分析器:查询缓存没有匹配的话,就会开始接下来的查询流程。首先mysql需要分析一条语句的语法是否正确。selec * from user wehre id = 1; 如果语法错误,mysql会抛出相应的 You have an error in your SQL syntax; 错误。如果预发分析没有问题则会进入到后续流程。
  • 优化器:当已经确定了你的sql语句预发这些没有问题后,会接着对sql语句进行相应的优化,主要包括索引选用,join连接顺序等。mysql优化主要是基于成本分析做的,分析各种情况的成本最终决定查询方式。总之优化器会帮我们优化我们的sql语句,提升效率,但优化器的优化结果并不一定是最好的,有时候可能会和我们的预期不一致,此时就需要对sql进行相应的调整了。
  • 执行器:语句优化完成后,就需要真正执行语句了。执行器会首先判断用户是否有对当前表查询权限,没有权限返回相应错误,有权限才会打开表执行语句并返回对应结果。

引擎层

引擎层主要就是各种不同引擎提供相应的api来操作数据了。

一条sql的基本执行流程基本就是这样,如果有索引,过程也是一样的,只不过会先根据索引查询数据,然后查询满足要求的数据返回结果。

后面我会对sql更新语句、索引、redo log等各部分分别进行介绍。

在sql server 发生未指定的错误_一条sql查询是怎么执行的?相关推荐

  1. SQL Server 2005 18452登录错误 的解决方法

    无法连接到服务器    服务器:消息18452,     级别16,状态1    [Microsoft][ODBC     SQL     Server     Driver][SQL     Ser ...

  2. 关于 SQL Server 登录问题(错误 233和18456)的解决方法

    此次遇到的问题类型为:错误233 和 错误18456 错误233 已成功与服务器建立连接,但是在登录过程中发生错取.(provider:共享内存提供程序,error:0-管道的另一端上无任何进程.)( ...

  3. mysql 1326_Mysql应用SQL Server 出现Error: 1326错误(管理器无法连接远程数据库)问题解决方案...

    <Mysql应用SQL Server 出现Error: 1326错误(管理器无法连接远程数据库)问题解决方案>要点: 本文介绍了Mysql应用SQL Server 出现Error: 132 ...

  4. SQL Server 无法生成 FRunCM 线程。请查看 SQL Server 错误日志和 Windows 事件日志(转)...

    前言: 今天遇到这个sql服务无法启用 .无法登陆 的情况..在google 百度 搜了一下.发现很多网站都是采集来的数据..(很奇怪这些采集站都那么靠前!) 照着文章里边的方法去试试都不行,,,后来 ...

  5. Microsoft SQL Server,附加数据库 错误:Error 916解决方法

    Microsoft SQL Server,附加数据库 错误:Error 916解决方法 参考文章: (1)Microsoft SQL Server,附加数据库 错误:Error 916解决方法 (2) ...

  6. sql服务器显示error,SQL Server 出现Error: 1326错误(管理器无法连接远程数据库)问...

    SQL Server 出现Error: 1326错误 我们在在使用SQL Server时都会遇到使用SQL Server Management Studio无法连接远程数据库实例的问题,错误描述信息摘 ...

  7. SQL Server 2012 安装出现错误

    SQL Server 2012 安装出现错误 由于疫情,开始学数据库的我在家安装SQL Server 2012,本想着安装一个软件而已,不会太难,然而我错了...从没安装过SQL Server 201 ...

  8. Microsoft SQL Server 2008 R2提示错误:此计算机上安装了 Microsoft Visual Studio 2008 的早期版本→解决办法

    安装SQL Server 2008 R2,提示错误:此计算机上安装了 Microsoft Visual Studio 2008 的早期版本.请在安装 SQL Server 2008 前将 Micros ...

  9. 在SQL Server中如何获得刚插入一条新记录的自动ID号

    在SQL Server中如何获得刚插入一条新记录的自动ID号 收藏 --------------------------------------------------------------- 使用 ...

最新文章

  1. 神策数据斩获三殊荣,美通社小饭桌正和岛齐认可
  2. android 活动说明,Android – 如何发送GCM推送通知以及要加载哪些活动的说明?
  3. Win32 串口编程笔记1
  4. 04_面向初学者的快速入门、建立图像分类的一个神经网络、训练这个神经网络、评估模型的精确度
  5. c#文本框只能填入数字和字母
  6. 四种为HttpClient添加默认请求报头的解决方案
  7. android 仿ios timepicker,android:TimePicker仿照IOS時間選擇器,可自定義選擇器
  8. 如何C#中实现在TreeView查找某一节点
  9. TCP四种定时器--学习笔记
  10. Android系统(23)---Android 应用分屏
  11. 美团推出语音应用平台 已与奔驰、小米等企业达成合作
  12. complex类模板c++_高中地理综合题答题模板,学霸们都收藏了!
  13. linux搭建博客Day1
  14. 常平计算机培训班,常平大朗CNC编程培训速成班,一个月学会UG编程
  15. qt如何编写android程序,如何利用Qt开发Android应用程序
  16. 计算机上如何查找什么占网速,怎么查看网速被占用(宽带100m但wifi很慢)
  17. 数字孪生助力智慧城市智能化发展
  18. 浅谈网站PR值 如何提高PR值
  19. Android Parcel对象详解
  20. 【详解】jupyter 如何添加文字标题

热门文章

  1. android河流曲线控件,London | Riverwalk,河流曲线的黄金比例
  2. java程序linux自己更新自己,Linux下升级JAVA的一个小方法
  3. 32位系统安装oracle11g,windows系统下 32位 安装Oracle 11g R2(11.2.0.1.0)图文安装教程
  4. pycharm和mysql_数据库 mysql 和 pycharm交互
  5. css如何调整红心样式_条码软件如何调整条码数据的样式
  6. php中数字字符串转换为字符串,php如何实现数字转字符串,php字符串转换为数字...
  7. python ssh模块stdout.read 和recv_paramiko SSH 模块简单应用。
  8. 单位转换html代码,万能在线单位转换器 转换器网
  9. java xml 画表格_用js+xml自动生成表格的东西
  10. 在设计四人抢答器中灯全亮_数字电子技术课程设计报告(四人抢答器).doc