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




推荐阅读
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了OkHttp3的基本使用和特性,包括支持HTTP/2、连接池、GZIP压缩、缓存等功能。同时还提到了OkHttp3的适用平台和源码阅读计划。文章还介绍了OkHttp3的请求/响应API的设计和使用方式,包括阻塞式的同步请求和带回调的异步请求。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 解决Sharepoint 2013运行状况分析出现的“一个或多个服务器未响应”问题的方法
    本文介绍了解决Sharepoint 2013运行状况分析中出现的“一个或多个服务器未响应”问题的方法。对于有高要求的客户来说,系统检测问题的存在是不可接受的。文章详细描述了解决该问题的步骤,包括删除服务器、处理分布式缓存留下的记录以及使用代码等方法。同时还提供了相关关键词和错误提示信息,以帮助读者更好地理解和解决该问题。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • php缓存ri,浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
    thinkPHP的F方法只能用于缓存简单数据类型,不支持有效期和缓存对象。S()缓存方法支持有效期,又称动态缓存方法。本文是小编日常整理有关thinkp ... [详细]
  • 旁路|发生_Day749.旁路缓存:Redis是如何工作的Redis 核心技术与实战
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Day749.旁路缓存:Redis是如何工作的-Redis核心技术与实战相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 语法:CREATE[索引类型]INDEX索引名称ON表名(列名)WITHFILLFACTOR填充因子值0~100GOUSE库名GOIFEXISTS(SELECT*FR ... [详细]
  • MySQL入门_MySQL入门篇!聊聊数据库与MySQL的相关概念
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了MySQL入门篇!聊聊数据库与MySQL的相关概念相关的知识,希望对你有一定的参考价值。 ... [详细]
  • MYsql_linux mysql
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了linuxmysql相关的知识,希望对你有一定的参考价值。一数据库安装查看:[[email pr ... [详细]
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社区 版权所有