热门标签 | 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




推荐阅读
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 本文详细介绍了如何使用Python编写爬虫程序,从豆瓣电影Top250页面抓取电影信息。文章涵盖了从基础的网页请求到处理反爬虫机制,再到多页数据抓取的全过程,并提供了完整的代码示例。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 理解存储器的层次结构有助于程序员优化程序性能,通过合理安排数据在不同层级的存储位置,提升CPU的数据访问速度。本文详细探讨了静态随机访问存储器(SRAM)和动态随机访问存储器(DRAM)的工作原理及其应用场景,并介绍了存储器模块中的数据存取过程及局部性原理。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文讨论了如何根据特定条件动态显示或隐藏文件上传控件中的默认文本(如“未选择文件”)。通过结合CSS和JavaScript,可以实现更灵活的用户界面。 ... [详细]
  • 在维护公司项目时,发现按下手机的某个物理按键后会激活相应的服务,并在屏幕上模拟点击特定坐标点。本文详细介绍了如何使用ADB Shell Input命令来模拟各种输入事件,包括滑动、按键和点击等。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 配置Windows操作系统以确保DAW(数字音频工作站)硬件和软件的高效运行可能是一个复杂且令人沮丧的过程。本文提供了一系列专业建议,帮助你优化Windows系统,确保录音和音频处理的流畅性。 ... [详细]
  • 深入解析TCP/IP五层协议
    本文详细介绍了TCP/IP五层协议模型,包括物理层、数据链路层、网络层、传输层和应用层。每层的功能及其相互关系将被逐一解释,帮助读者理解互联网通信的原理。此外,还特别讨论了UDP和TCP协议的特点以及三次握手、四次挥手的过程。 ... [详细]
  • 尽管深度学习带来了广泛的应用前景,其训练通常需要强大的计算资源。然而,并非所有开发者都能负担得起高性能服务器或专用硬件。本文探讨了如何在有限的硬件条件下(如ARM CPU)高效运行深度神经网络,特别是通过选择合适的工具和框架来加速模型推理。 ... [详细]
  • MySQL 高性能实战教程
    本课程深入探讨 MySQL 的架构、性能调优、索引优化、查询优化及高可用性等关键领域。通过实际案例和详细讲解,帮助学员掌握提升 MySQL 数据库性能的方法与技巧。 ... [详细]
  • MySQL PMM:MyISAM 和 Aria 存储引擎的性能优化
    本文探讨了 MyISAM 和 Aria 存储引擎在 MySQL 中的关键性能指标,包括密钥缓冲区效率、页面缓存读写性能以及事务日志同步策略。通过优化这些参数,可以显著提升数据库的整体性能。 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
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社区 版权所有