热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MFC程序连接MySQL成功实现查询功能,但无法实现修改操作——详解查询语句在MySQL中的使用过程

selectxxx,xxx,xxxfromxxxwherexxxxxx,xxxxxx程序的日常开发中,我们经常会写到各种各样的简单的,复杂的查询sql语

c84ea19d283192cf4f20ccc367c1a461.gif

select xxx,xxx,xxx from xxx where xxx=xxx,xxx=xxx

程序的日常开发中,我们经常会写到各种各样的简单的,复杂的查询sql语句。mysql也总是能把我们想要的结果返回给我们,但是你知道这个查询在mysql内部的一个执行过程么?

今天就带领大家简单看一看一个查询语句在mysql中的执行过程吧。

18caae6911c3c36e50046ff427a87696.gif

Mysql体系结构

要想知道一个查询语句在mysql的执行过程,首先先了解下mysql的体系架构吧Mysql体系结构如图所示b87c896c83d0260a59286a81bebb8cac.png从图中可以看出mysql的体系结构分为了三层,连接层,SQL层和存储引擎层,但实际连接层和SQL层又统一称为SERVER层。所以mysql其实是由SERVER层存储引擎层组成的。下面就带领大家一层一层的来认识mysql架构。

当我们在代码中编写好一条sql后,执行代码,请求就会发送到mysql,与mysql建立连接,这个时候我们最先遇到了mysql的连接层:

连接层

应用程序访问mysql,先通过接口(如ODBC,JDBC等)来与mysql建立连接。连接层包含通信协议,线程处理,用户名密码认证三个部分。

  • 通信协议:该部分主要是来判断客户端的版本和mysql服务端是否兼容。

  • 线程处理:该部分将请求过来的sql语句分配到一个线程中处理,一条sql一个线程,一个线程又是一个逻辑CPU,不会在多个逻辑CPU之间进行切换。

  • 用户名密码认证:该部分就是看你配置或者输入的用户名,密码,host以及端口是否授权允许连接mysql服务端。

所以连接层的核心作用其实就是验证你是否能够进行接下来的操作,要是可以进行,ok继续往下走,要是不行,mysql就会对你说 拜拜走好不送。

好不容易我们通过了连接层,证明了我们可以进行接下来的操作了,但是你以为这样就完了么?并没有,在连接层这里,我们通过了用户名密码认证,同时也会将该账号所拥有的库表读写权限等信息读取到,并且这个连接断开重连前,我们所有的操作都将依赖于这个时候读到的权限。

也就是说哪怕这个时候我们用另一个连接给当前账号修改了权限,这个账号的权限也不受影响。只有在重新建立新的连接后才会使用新的权限设置。

这些完成后,我们的查询语句来到了sql层。

SQL层

SQL层包含权限判断,查询缓存,解析器,预处理,查询优化器,缓存和执行计划七个部分

  • 权限判断:判断当前用户是否有权限操作某个库某个表。

  • 查询缓存:查询缓存通过Query Cache进行操作,如果数据在Query Cache中,则直接返回结果给客户端。

  • 查询解析器:查询解析器针对SQL语句进行解析,判断语法是否正确。

  • 预处理器 :预处理器对解析器无法解析的语义进行处理。

  • 优化器:优化器对SQL进行改写和相应的优化,并生成最优的执行计划,就可以调用程序的API接口,通过存储引擎层访问数据。

语句达到sql层后,mysql会先查询缓存,看之前是否执行过这条sql,之前执行的语句及结果会以key-value的形式被缓存在内存中,key是查询的sql语句,value是查询到的结果。如果mysql在缓存中获取到了这个key,就会将这个value直接返回给客户端不再进行接下来的操作。如果不在的话,mysql就会继续向下执行,查询到结果后将结果缓存起来。

( 其实是不建议使用mysql的缓存的,mysql的缓存失效频率非常之高,而且MySQL 8.0 版本也直接将查询缓存的整块功能删掉了,也就是说 8.0 开始彻底没有这个功能了)

当缓存中没有我们要查询的数据时,优化器(代表查询解析器和预处理器)就会开始工作了。优化器首先会先进行词义分析,检测出你输入的sql语句都有什么,又代表什么,试图揣测你的意图。揣测完你的意图后,优化器会进行语法分析,判断你输入的内容是否符合mysql的语法要求。

ok,语法没有问题,mysql也知道了你的意图,接下来mysql就要看怎么处理才可以最快速的拿到你想要的结果,这个时候优化器就要派上用场了。当你他要查询的表里面有多个索引的时候,优化器要决定使用哪个索引;或者在一个语句有多表关联(join)的时候,优化器要决定各个表的连接顺序。

(优化器有的时候挺笨的,需要我们强行矫正)

优化器阶段完成后,这个语句的执行方案就确定下来了,然后进入执行器阶段。

执行器开始正式执行前,会先校验你的权限。没有的话mysql会返回如下错误

ERROR 1142 (42000): SELECT command denied to user 'xxx'@'xxx' for table 'xxx'

如果权限校验OK,就会打开表开始执行,打开表的时候,执行器就会获取到这张表定义的存储引擎,然后调用该引擎提供的接口拿到需要的数据返回给客户端。

至此,一条查询语句在mysql中的一个完整的流程就走完了。

刚刚上文中提到了存储引擎,下面的内容对存储引擎做一个简单的介绍。

存储引擎

目前mysql数据库及其分支主要的存储引擎有InnoDB,MyISAM,Memory,blackhole,TokuDB和MariaDB columnstore。下表为主要的存储引擎的特性对比

存储引擎名称特点应用场景
Innodb支持事务、行锁,支持MVCC多版本并发控制,并发性高应用于OLTP业务系统
MyISAM不支持事务,表锁,MYSQL8.0后彻底被废弃,并发很低,资源利用率也低应用于OLAP业务系统,建议在生产环境中尽量少用该存储引擎
Memory表中的数据都在内存中存放,不落地。支持Hash和Btree索引,数据安全性不高,读取速度快应用于对数据安全性要求不高的环境下
TokuDB归Percona公司所有,支持事务,支持压缩功能,高速写入功能(比Innodb快9倍),在线Online DDL,不产生索引碎片应用于海量数据的存储场景下,空间占比低
MariaDB columnstore列式存储引擎,高压缩功能数据仓库,OLAP业务系统
blackhole并不存储数据,数据写入时只写binlog常用来做binlog转储或测试

Innodb和MyISAM是目前最主流的两个存储引擎,不过MyISAM在mysql8.0后被彻底废弃。两者之间的主要区别如下表

区别InnodbMyISAM
事务的支持支持事务不支持事务
锁粒度行锁表锁
并发性高并发低并发
构成结构和缓存机制数据和所以文件都存储在.ibd文件里,并且都是缓存在内存里数据文件的扩展名为.MYD 索引文件的扩展名是.MYI 只缓存索引文件 不缓存数据文件
select count(*)需要全表扫描,统计所有行数只需要从计算器中读出保存好的行数即可

02182ea3f116093074ae76c9175facfc.gif

d708e187f9ee50207624171d9470d190.gif




推荐阅读
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细探讨了不同SQL数据库管理系统(DBMS)在限制输出结果、拼接字段和日期时间处理方面的函数差异。通过具体示例,帮助读者理解并掌握如何在不同DBMS中实现相同功能。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 本文介绍如何使用 Python 提取和替换 .docx 文件中的图片。.docx 文件本质上是压缩文件,通过解压可以访问其中的图片资源。此外,我们还将探讨使用第三方库 docx 的方法来简化这一过程。 ... [详细]
  • 在维护公司项目时,发现按下手机的某个物理按键后会激活相应的服务,并在屏幕上模拟点击特定坐标点。本文详细介绍了如何使用ADB Shell Input命令来模拟各种输入事件,包括滑动、按键和点击等。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • 解决Element UI中Select组件创建条目为空时报错的问题
    本文介绍如何在Element UI的Select组件中使用allow-create属性创建新条目,并处理创建条目为空时出现的错误。我们将详细说明filterable属性的必要性,以及default-first-option属性的作用。 ... [详细]
  • 本文详细介绍了 MySQL 中 LAST_INSERT_ID() 函数的使用方法及其工作原理,包括如何获取最后一个插入记录的自增 ID、多行插入时的行为以及在不同客户端环境下的表现。 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 本文详细介绍了MySQL InnoDB存储引擎中的间隙锁概念及其作用,探讨了它在解决幻读问题方面的关键角色,并解析了间隙锁与其他操作之间的冲突关系。同时,文章还讨论了next-key-lock的构成及应用,以及在不同场景下的优化策略。 ... [详细]
  • 构建基于BERT的中文NL2SQL模型:一个简明的基准
    本文探讨了将自然语言转换为SQL语句(NL2SQL)的任务,这是人工智能领域中一项非常实用的研究方向。文章介绍了笔者在公司举办的首届中文NL2SQL挑战赛中的实践,该比赛提供了金融和通用领域的表格数据,并标注了对应的自然语言与SQL语句对,旨在训练准确的NL2SQL模型。 ... [详细]
  • MySQL缓存机制深度解析
    本文详细探讨了MySQL的缓存机制,包括主从复制、读写分离以及缓存同步策略等内容。通过理解这些概念和技术,读者可以更好地优化数据库性能。 ... [详细]
  • SQLite 动态创建多个表的需求在网络上有不少讨论,但很少有详细的解决方案。本文将介绍如何在 Qt 环境中使用 QString 类轻松实现 SQLite 表的动态创建,并提供详细的步骤和示例代码。 ... [详细]
author-avatar
沈巛小糖meimei昌策_247
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有