聊聊mysql执行过程

在项目开发当中 ,很多时候,我们的数据库应用优化都是从表层到里层的一个过程。比如一个查询写下来 ,我们的优化方向大多时候都是先看方法执行的时间长短,然后再决定是否去优化它,下意识的第一步操作都是看是否命中索引,接下去再看数据量、设计是否合理。。。等等。

那么其实在我们一开始的时候,如果我们事先知道数据库的一个执行流程,我们就可以按照他的规则去写sql,进而提高性能和开发效率。

这点有点像前些年 我们国家做出口的时候  开始的时候没有吃透人家的一些法律规则 导致出现违规不合格的情况  进而被退货造成损失。所以熟悉游戏规则很重要。

很多的查询优化工作实际上就是遵循一些原则让MySQL的优化器能够按照预想的合理方式运行而已。比如索引。


下面看下一条sql 的执行过程。分为5个步骤。

7dc618ee9a3fe6ecdb6f2ab83c685a17.png

图片来源网络

1、连接器

负责与客户端的通信,是半双工模式,这就意味着某一固定时刻只能由客户端向服务器请求或者服务器向客户端发送数据,而不能同时进行,其中mysql在与客户端连接TC/IP的;

验证请求用户的账户和密码是否正确;

如果用户的账户和密码验证通过,会在mysql自带的权限表中查询当前用户的权限:

说白了,就是我们的数据库连接串连接到数据库的过程。

2、缓存

    mysql的缓存主要的作用是为了提升查询的效率,缓存以key和value的哈希表形式存储,key是具体的sql语句,value是结果的集合。如果无法命中缓存,就继续走到分析器的的一步,如果命中缓存就直接返回给客户端 。,目前在5.6的版本中已经默认关闭了。如果读写很频繁的话,依赖命中率低,二来频繁的缓存操作反而性能更低。

3、分析器

   分析器的主要作用是将客户端发过来的sql语句进行分析,这将包括预处理与解析过程,在这个阶段会解析sql语句的语义,并进行关键词和非关键词进行提取、解析,并组成一个解析树。如果分析到语法错误,会直接给客户端抛出异常。就是一个sql格式化的过程。

4、优化器

这部主要是进行sql语句的优化,会根据执行计划进行最优的选择,匹配合适的索引,选择最佳的执行方案。

比如一个典型的例子是这样的:

表T,对A、B、C列建立联合索引,在进行查询的时候,当sql查询到的结果是:select xx where  B=x and A=x and C=x.很多人会以为是用不到索引的,但其实会用到,虽然索引必须符合最左原则才能使用,但是本质上,优化器会自动将这条sql优化为:where A=x and B=x and C=X,这种优化会为了底层能够匹配到索引,同时在这个阶段是自动按照执行计划进行预处理,mysql会计算各个执行方法的最佳时间,最终确定一条执行的sql交给最后的执行器。

所以我们在写sql的时候,最好是按照建立好的索引顺序来添加查询条件,等于就省去了优化的时候,进而提高效能。

5、执行器

 在执行器的阶段,此时会调用存储引擎的API,API会调用存储引擎,常用的是myisam和innodb:

myisam 不支持事务 ,不支持行锁,支持表锁,适合读多写少。

innodb  支持行锁 表锁,支持事务。应该是用的最多的存储引擎,也是mysql默认的存储引擎。

终上所述

客户端 ----> 连接器 ----> 缓存 ----> 分析器 ----> 优化器 ----> 执行器 ----> 存储引擎 ----> 客户端

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291845.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

01. Node js Hello world

2019独角兽企业重金招聘Python工程师标准>>> 01. Node js Hello world 环境安装 官网http://nodejs.org/ Node.js is a platform built on Chromes JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, no…

异常检测之浅谈入侵检测

打开微信扫一扫,关注微信公众号【数据与算法联盟】 转载请注明出处:http://blog.csdn.net/gamer_gyt 博主微博:http://weibo.com/234654758 Github:https://github.com/thinkgamer前言 由于业务关系,最近一段时间一直在…

蓝宝石rx580gpuz参数_蓝宝石RX580 2048SP 4G D5 白金版 OC游戏测试

今年,显卡的价格可谓是一路飙升,老黄家新卡价格翻番,甜点级新卡迟迟未发,而市场上则鱼龙混杂,那么为什么不来看看这款蓝宝石 RX580 2048SP 4G 白金版 OC?蓝宝石 RX580 2048SP 4G 白金版 OC是近期推出的一款…

08-贪婪算法

数据结构和算法 基于《算法图解》—Aditya Bhargava 和《数据结构》—严蔚敏 第8章 贪婪算法 贪婪算法的优点: 简单易行,让每一步都选择局部最优解,最终得到的就是全局最优解。 贪婪算法是近似算法:在获得精确解需要的时间太长时…

企业知识库在跨地域团队协作中的价值

随着全球化进程的不断加速,越来越多的企业开始面临跨地域协作的挑战。在这种背景下,企业知识库作为一种重要的知识管理工具,对于提高团队协作效率、促进知识共享与创新具有不可替代的价值。接下来就说一下知识库在跨地域团队协作中的重要性及…

MySQL知识总结(二)基本语句总结

1. 数据库 查看数据库 show databases; 使用数据库 use [数据库名] 如:use mysql 创建数据库 CREATE DATABASE bruce DEFAULT CHARACTER SET utf8 删除数据库 drop database bruce 查询mysql版本 select version(); 查询当前用户 select user(); 显示当前库的所有表…

linux网络编程之地址结构sockaddr和sockaddr_in的区别

1、介绍sockaddr 结构体struct sockaddr在/usr/include/linux/socket.h中定义 struct sockaddr {unsigned short sa_family; // 2 bytes address family, AF_xxxchar sa_data[14]; // 14 bytes of protocol address }; 2、介绍sockaddr_in 结构体stru…

Asp-Net-Core开发笔记:接口返回json对象出现套娃递归问题

前言看了下推送记录,一个月前,OK,我又变成月更了o(╯□╰)o,这绝对不行![○・`Д・ ○]所以今天来更新了其实不是我懒得更新或者是太忙,其实是最近在写一篇很长的博客&…

spring之二——使用maven创建一个java project

2019独角兽企业重金招聘Python工程师标准>>> maven的安装及Eclipse maven插件安装这里不再说了,安装可以看这篇博客: http://www.blogjava.net/fancydeepin/archive/2012/07/13/eclipse_maven3_plugin.html 需要注意的是,maven在w…

自从装了windows神器,再也不用羡慕mac了

1. 命令行神器 1.1 GOW Gow(Gnu On Windows)是Cygwin的轻量级替代品。 它使用一个方便的NSIS安装程序,安装超过100个非常有用的开源UNIX应用程序,编译为本机win32二进制文件。 它被设计为尽可能小,大约18 MB&#xff…

供销大集长期持有_谁是下一个供销大集?(附股)

昨天我们在文章分析了芯片这波行情的几个细节,觉得以芯片股的热点状态还是很健康的,以芯片为首的自主可控还有得玩。今天,这个方向又有了新的变化,结合这些变化,再说说我们的跟踪思路。昨天芯片股出现了高低位切换的现…

linux网络编程之网络字节序、主机字节序、大端、小端

1、主机字节序介绍 不同的CPU有不同的字节序类型 这些字节序是指整数在内存中保存的顺序 这个叫做主机字节序,存储方式有2种 1)、大端模式 大端模式(Big-Endian)就是高位字节排放在内存的低地址端(即该值的起始地址),低位字节排放在内存的高地址端 2 ) 、小端模式 小端存储在…

第1章 绪论

《数据结构》学习笔记 第1章 绪论 1.1 数据结构的研究内容 计算机计算数值时,一般经过一下步骤: 1.从具体问题抽象出数学模型(实质是分析问题)。 2.设计一个解次数学模型的算法。 3.编写程序,进行测试、调试&#xf…

比较规则

比较规则 , EQ, <>, NE, <, LT, >, GT, <, LE, >, GE 非引用数据类型的兼容要求 l 就基本类型来说&#xff0c;需要类型、长度&#xff08;for the types c, n, p, x&#xff09;、小数位&#xff08;for the type p&#xff09;匹配 l 对于结构来说&#…

【转】《从入门到精通云服务器》第六讲—OpenStack基础

前五期的《从入门到精通云服务器》受到了广泛好评&#xff0c;收到留言&#xff0c;有很多读者对云计算相关的技术非常感兴趣。应观众要求&#xff0c;我们这期要安利一条纯技术内容。准备好瓜子、花生&#xff0c;随小编一起进入OpenStack 基础知识大讲堂吧。 了解OpenStack O…

C#中泛型约束的具体用法

前言上一篇博文简单介绍了泛型的约束&#xff0c;说是通过where<>来实现具体委托占位符的约束。那么约束又有什么类型和次序呢。这篇文章咱们一起看看。目前共5种类型的约束。类名&#xff1a;只有这个类型的类或从它继承的类才能用作类型实参class&#xff1a;任何引用类…

python自动注册邮箱_[转][Python][自动登录163邮箱]

#-*- coding:UTF-8 -*-import urllib,urllib2,cookielibimport xml.etree.ElementTree as etree #xml解析类class Login163:#伪装browserheader {User-Agent:Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6}username passwd co…

系统架构:Web应用架构的新趋势 前后端分离的想法

最近研究servlet&#xff0c;看书时候书里讲到了c/s架构到b/s架构的演变&#xff0c;讲servlet的书都很老了&#xff0c;现在的b/s架构已经不是几年前的b/s架构&#xff0c;其实b/s架构就是web应用开发&#xff0c;对于这样的架构我们现在应该考虑的是前端和后端的分离&#xf…

linux网络编程之inet_addr和inet_ntoa使用总结

1、介绍inet_addr函数 inet_addr函数转换网络主机地址(如192.168.1.10)为网络字节序二进制值,如果参数char *cp无效,函数返回-1(INADDR_NONE),这个函数在处理地址为255.255.255.255时也返回-1,255.255.255.255是一个有效的地址,不过inet_addr无法处理 in_addr_t inet_add…

高并发高可靠性系统思考1

CPU不是瓶颈&#xff0c;网络才是&#xff1b; 墨菲定律&#xff1a;任何事情都没表面看起来那么简单&#xff1b;会出错的总会出错&#xff1b; 可靠性&#xff1a; 集群&#xff1a;无状态集群&#xff1b;有状态集群&#xff0c;很难处理&#xff0c;尽量剥离出状态部分做集…