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




推荐阅读
  • 本文探讨了在SQL Server 2008环境下,当尝试删除拥有数据库架构的用户时遇到的问题及解决方案,包括如何查询和更改架构所有权。 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • Django与Python及其他Web框架的对比
    本文详细介绍了Django与其他Python Web框架(如Flask和Tornado)的区别,并探讨了Django的基本使用方法及与其他语言(如PHP)的比较。 ... [详细]
  • 本文详细介绍了如何搭建一个高可用的MongoDB集群,包括环境准备、用户配置、目录创建、MongoDB安装、配置文件设置、集群组件部署等步骤。特别关注分片、读写分离及负载均衡的实现。 ... [详细]
  • 本文记录了在Windows 8.1系统环境下,使用IIS 8.5和Visual Studio 2013部署Orchard 1.7.2过程中遇到的问题及解决方案,包括503服务不可用错误和web.config配置错误。 ... [详细]
  • SQL Server 存储过程实践任务(第二部分)
    本文档详细介绍了三个SQL Server存储过程的创建与使用方法,包括统计特定类型客房的入住人数、根据房间号查询客房详情以及删除特定类型的客房记录。 ... [详细]
  • 本文介绍如何通过参数化查询来防止SQL注入攻击,确保数据库的安全性。示例代码展示了在C#中使用参数化查询添加学生信息的方法。 ... [详细]
  • GreenPlum采纳ShareNothing的架构,良好的施展了便宜PC的作用。自此IO不在是DW(datawarehouse)的瓶颈,相同网络的压力会大很多。然而GreenPlum的查问优化策略可能防止尽量少的网络替换。对于首次接触GreenPlum的人来说,必定耳目一新。 ... [详细]
  • 本文介绍了一种使用SQL Server存储过程来实现基于单一条件的高效分页查询的方法。通过示例代码,详细说明了如何构建和执行这种分页查询。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • 解决PHP项目在服务器无法抓取远程网页内容的问题
    本文探讨了在使用PHP进行后端开发时,遇到的一个常见问题:即在本地环境中能够正常通过CURL获取远程网页内容,但在服务器上却无法实现。我们将分析可能的原因并提供解决方案。 ... [详细]
  • 从理想主义者的内心深处萌发的技术信仰,推动了云原生技术在全球范围内的快速发展。本文将带你深入了解阿里巴巴在开源领域的贡献与成就。 ... [详细]
  • 本文详细介绍了在Linux操作系统上安装和部署MySQL数据库的过程,包括必要的环境准备、安装步骤、配置优化及安全设置等内容。 ... [详细]
  • 本文旨在探讨设计模式在Visual FoxPro (VFP) 中的应用可能性。虽然VFP作为一种支持面向对象编程(xbase语言)的工具,其OO特性相对简明,缺乏高级语言如Java、C++等提供的复杂特性,但设计模式作为一种通用的解决方案框架,是否能有效应用于VFP,值得深入研究。 ... [详细]
  • 关于进程的复习:#管道#数据的共享Managerdictlist#进程池#cpu个数1#retmap(func,iterable)#异步自带close和join#所有 ... [详细]
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社区 版权所有