Select * from user的千层套路

作为一个程序员,可以说是无时无刻不与sql语句进行打交道,可是你真的了解MySQl的基本框架吗?以及你所写的每一条SQL是如何运行的吗?就比如下面这条平平无奇的SQL语句:

select * from user where id='1';

对于这么一条简单的不能再简单的sql语句来说mysql服务器做了哪些处理呢?下面我们将说一下关于mysql数据库中对sql语句的处理逻辑

MySql的基本架构

要想要了解sql语句的内部处理逻辑,我们需要先学习Mysql的基本架构图,这样才能醍醐灌顶,有更加整体的把握

MySQL基本框架

从这个MySQL的架构图中我们可以看到大体来说MySQL的架构分为两层,分别是:Server层和存储引擎层。

其中Server层是公有的,而存储引擎层是以插件的形式进行扩展的。对于MySQL来说,常见的存储引擎有:InnoDB和MyISAM

而且我们也可以从中看出一条SQL语句从开始运行到最后展出执行结果大概会经历:连接管理、解析与优化以及最后到存储引擎这三关。

下面我们就分别分析一下这三关都有啥具体的内容,Let's go!

连接管理

连接管理是SQL语句执行过程中的第一关,控制着客户端和Server服务端的交互,连接管理主要工作是客户端的身份认证和连接线程的管理。

每个客户端与Server建立连接时,服务器会创建一个线程来与客户端交互,交互的第一项内容就是验证客户端的身份,认证凭证是基于客户端发起连接请求时携带的主机信息、用户名、密码。

如果认证失败,则结束连接任务,并且返回Access denied for user的错误

如果认证成功,还会到权限表中查询该用户的权限,在此次连接下,后续的权限判断都是基于此时读取的权限为依据。

所以说权限是在一开始连接管理的时候就已经确定了。

其次是负责客户端与服务端进行连接,连接管理也做了优化,并不是每个客户端执行完任务之后,就把该线程销毁,而是由连接管理将这些线程缓存起来,等待新的连接,这也就不会频繁的创建和销毁线程,从而节约了开销。

解析与优化

完成连接管理之后,SQL 语句执行的第二步就是解析和优化,SQL 语句查询的所有操作都在这里进行处理。在此过程中首先就是要查询缓存。

查询缓存

MySQL 服务器拿到查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。

但是实际使用中会有很多问题:

  • 命中率低下:只要有稍微的不同就不会命中

  • 缓存数据发送了变化,导致取到错误数据

  • 一旦表中数据或结构改变了缓存也会删除

所以缓存对 MySQL 数据库来说弊大于利,所以在 MySQL 8.0 版本直接将查询缓存的整块功能删掉了

语法解析和预处理

如果查询缓存没有命中,接下来就需要进入正式的查询阶段了。因为客户端程序发送过来的请求只是一段文本而已,所以 MySQL 服务器程序首先要对这段文本做语法解析。

首先通过关键字将 SQL 语句进行解析,并且生成一个“解析树”。MySQL 解析器将使用 MySQL 语法规则验证和解析查询,例如,关键字是否使用正确、关键字的顺序是否正确或者引号是否前后匹配等。

预处理是根据一些 MySQL 规则进一步检查解析树是否合法,例如数据表和数据列是否存在,还会解析名字和别名,看看他们是否有歧义等。

查询优化

MySQL 的优化程序会对我们的语句做一些优化,如外连接转换为内连接、表达式简化、子查询转为连接等等。优化的结果就是生成一个执行计划,这个执行计划表明了应该使用哪些索引进行查询,表之间的连接顺序是啥样的。

执行器

执行器会执行查询优化后的执行计划,通过与存储引擎交互,完成数据的查询操作,返回最终的数据结果。

首先会判断是否有该表权限。

如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。

比如我们这个例子中的表 user 中,假设 ID 字段没有索引,那么执行器的执行流程是这样的:

  • 调用 InnoDB 引擎接口取这个表的第一行,判断 ID 值是不是 1,如果不是则跳过,如果是则将这行存在结果集中;

  • 调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。

  • 执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。

到这里,执行 SQL 语句就执行完了。

存储引擎

到上面为止,SQL 语句就执行完了,但是与真实数据打交道的是存储引擎,存储引擎是 MySQL服务器对数据的存储和提取操作的封装模块。我们知道表是由一行一行的记录组成的,但这只是一个逻辑上的概念,物理上如何表示记录,怎么从表中读取数据,怎么把数据写入具体的物理存储器上,这都是存储引擎负责的事情。

为了实现不同的功能,MySQL提供了各式各样的存储引擎,不同存储引擎管理的表具体的存储结构可能不同,采用的存取算法也可能不同。比如,MySQL5.7 之后默认的 InnoDB 存储引擎。

InnoDB

InnoDB是一个事务型的存储引擎,有行级锁定和外键约束,提供了具有提交、回滚和崩溃回复的事务安全,但是对比MyLSAM引擎,写的效率会差一些,并且会占用更多的磁盘空间以保持数据和索引

特点:

  • 更新多的表,适合处理多重并发的更新请求

  • 支持事务

  • 可以从灾难中恢复(从bin-log日志等)

  • 外键约束,支持外键

  • 支持自动增加列属性auto_increment

MylSAM

MylSAM存储引擎独立于操作系统,系统兼容性好。在建表的时候会创建三个文件,分别是.fm,.MYD,.MYI。这样会导致对大文件的操作慢,但是由于.MYD单独存放数据自然可以优化数据库的查询等操作

.fm:存储表的定义,即表结构

.MYD:存储表里面的数据

.MYI:存储所以

特点:

  • 不支持事务

  • 不支持外键

  • 查询速度快,但是如果数据库表insert和update操作多的话由于采用表锁导致效率低

  • 对表进行加锁

最后

  • 如果觉得看完有收获,希望能给我点个赞,这将会是我更新的最大动力,感谢各位的支持

  • 欢迎各位关注我的公众号【java冢狐】,专注于java和计算机基础知识,保证让你看完有所收获,不信你打我

  • 如果看完有不同的意见或者建议,欢迎多多评论一起交流。感谢各位的支持以及厚爱。

扫码关注我

sql server 2014 判断一个列某个字段是否相同_Select * from user的千层套路——一个sql是如何执行的...相关推荐

  1. SQL Server 2014 SP1 通过补丁KB3058865提供更新,SP1一文便知

    Microsoft SQL Server 2014 SP1 更新: SQLServer2014SP1-KB3058865-architecture-language.exe 安装完成后版本 12.0. ...

  2. SQL SERVER 2014无法启动T-SQL调试的解决方法(亲自实践)

    SQL SERVER 2014无法启动T-SQL调试的解决方法(亲自实践) 参考文章: (1)SQL SERVER 2014无法启动T-SQL调试的解决方法(亲自实践) (2)https://www. ...

  3. 在配置SQL server 2014时出现“附加数据库时出错。有关详情信息请单机“消息”列中的超链接”问题如何解决

    第一次做学生信息管理系统,俗话说的好"万事开头难",就在配置数据库的时候出现了如下的问题, 这个问题也很好解决,只要将需要附加进去的数据库文件位置修改到,SQL server 20 ...

  4. SQL Server 2014新特性——基数评估(白皮书阅读笔记)

    基数评估 目录 基数评估 说明 基数评估准确的重要性 模型假设 启用新的基数评估 验证基数评估的版本 在迁移到新的基数评估前要测试 校验基数评估 偏差问题 需要手动处理的变化 避免因为新的CE造成性能 ...

  5. SQL Server中的标识列

    一.标识列的定义以及特点 SQL Server中的标识列又称标识符列,习惯上又叫自增列. 该种列具有以下三种特点: 1.列的数据类型为不带小数的数值类型 2.在进行插入(Insert)操作时,该列的值 ...

  6. sql server 2014预览版发布

    MSDN发布sql server2014预览版,如下图: SQL Server 2014新特性: 微软SQL Server部门主管Eron Kelly介绍,通过将交易处理放到内存中进行,新的SQL S ...

  7. 抢先体验SQL Server 2014 CTP1!

    根据微软官方给出的消息,下一版本数据库平台SQL Server 2014将在今年年底发布,其中将包含表粒度级别的内存OLTP功能,而与其他内存数据库不同的是,这一功能将无需昂贵的硬件作为支持. 在本周 ...

  8. SQL Server 重置Identity标识列的值(INT爆了)

    一.背景 SQL Server数据库中表A中Id字段的定义是:[Id] [int] IDENTITY(1,1),随着数据的不断增长,Id值已经接近2147483647(int的取值范围为:-2 147 ...

  9. DBA基础系列SQL Server 2014:2. SQL Server用户数据库初始化配置

    前言 开始前先黑微软一把:Microsoft秉承一贯的简单易用作风(Next.Next.Next- )这点是它吸引用户的地方,但是这个优点如果用在数据库上将是一场灾难,如我们上一章讲到的SQL Ser ...

最新文章

  1. SQL 中循环、for循环、游标
  2. React + Koa 实现服务端渲染(SSR)
  3. 小学计算机课型有哪几种,小学信息技术课上常用几种教学方法.doc
  4. shell getopts
  5. java.lang.reflect.Method.getGenericParameterTypes()方法示例
  6. php 跨区域,PHP跨时区的功能实现
  7. 前端学习(2025)vue之电商管理系统电商系统之渲染订单列表数据
  8. JavaScript中try, catch, throw的用法
  9. 关于几个BeanPostProcessor各个回调的时机
  10. leetcode945. Minimum Increment to Make Array Unique
  11. 企业如何做好EDM-企业做EDM的方案设计
  12. 一起来学Spring Cloud | 第一章 :如何搭建一个多模块的springcloud项目
  13. 本地方法接口和本地方法栈总结
  14. 18个最受欢迎的低代码开发平台【开源】
  15. 2021年茶艺师(初级)考试题库及茶艺师(初级)考试技巧
  16. android 得到屏幕尺寸 状态栏尺寸 标题栏尺寸
  17. Vue报错Invalid handler for event “click“: got undefined的原因及解决办法
  18. Java常用加密解密算法全解
  19. 来篇鸡汤文吧,教你如何七周内从小菜鸟成长为一名合格的数据分析师
  20. 一、搜索引擎篇-揭开es神秘的面纱

热门文章

  1. 集中式还是分布式?账务类数据库架构的选型
  2. 您的包裹“ MySQL灵魂十连” 待签收
  3. 第一个国产Apache 顶级项目 Kylin,了解一下!| 原力计划
  4. 开万人 AI 大会什么感受?陆奇任大会主席 | AI ProCon 2020
  5. 超高薪的机器学习工程师和现在的前后端们有什么不同?
  6. 万字长文!Go 后台项目架构思考与重构
  7. 我眼中的分布式系统可观测性
  8. 异构计算崛起,GPU加速计算服务器FP5468G2应运而生
  9. 同心抗疫,IBM中国有限公司致客户的一封信
  10. 53 年 IT 老兵详谈传统网络到互联网的演变史