您当前的位置:首页 > 电脑百科 > 数据库 > MYSQL

MySQL语句是怎么实现的?需要进行合理的优化分析

时间:2019-06-11 10:10:17  来源:  作者:

想要深入的了解MySQL,首先要了解MySQL语句是怎么实现的,了解了MySQL里语句的执行过程可以更加快速的分析问题的原因,或者进行合理的优化。

MySQL语句是怎么实现的?需要进行合理的优化分析

 

MySQL的架构

MySQL的架构图如下所示,主要由以下几个部分组成:连接器,缓存,分析器,优化器,执行器和存储引擎。

MySQL语句是怎么实现的?需要进行合理的优化分析

 

MySQL可以分为server层和存储引擎层,server层包括连接器、分析器、优化器和执行器,主要负责SQL语法的解析,内置函数的实现,触发器,视图等。存储引擎层负责数据的存储和提取,存储引擎是插件式的,MySQL支持的存储引擎就有InnoDB、MyISAM、Memory等。目前,InnoDB是mysql默认的存储引擎。

连接器

连接器负责与客户端建立网络连接、校验用户名密码、校验用户权限、维持和管理连接等。

网络连接建立后,首先验证用户名和密码,用户名和密码验证通过以后连接器会到权限表里查询该用户的权限。之后,这个连接里的权限判断逻辑,都将依赖于此时读到的权限。这就意味着,一个用户成功连接后,再去修改该用户的权限,也不会影响到已经建立好的连接,只有重新建立连接权限才会生效。

MySQL的网络连接采用的是多线程模型,维护一个线程池,每当有一个新的连接请求时,就从空闲的线程池中选择一个线程进行处理。可以使用 show processlist 命令看到当前所建立的所有连接。

+------------+--------------+--------------------+------------------+---------+-------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+------------+--------------+--------------------+------------------+---------+-------+-------+------------------+
| 1801071833 | user_name | 10.1.1.1:49788 | test_db | Sleep | 131 | | NULL | 
| 2309292411 | user_name | 10.1.1.1:57642 | test_db | Query | 0 | NULL | show processlist |
复制代码

ID 表示建立连接的线程 ID 。客户端如果一段时间没有动作, Command 一栏就会显示Sleep,表示该连接处于空闲状态。 多线程的模型必然存在连接数有限的问题,因此客户端如果太长时间没有动静,连接器就会自动断开,回收线程。

缓存

连接建立后,就可以执行查询语句。查询语句首先会查询缓存中是否该语句的缓存结果,因为MySQL查询语句的执行结果可能会已K-V的形式存储在缓存中,SQL语句做KEY,查询的结果做值。

但是MySQL自带的缓存不建议使用,因为MySQL的缓存失效的非常频繁,只要对一个表有更新,那么这个表上所有的缓存都会失效,因此缓存命中率很低。不如在业务层用redis或者Memcached做缓存来的灵活高效。

MySQL语句是怎么实现的?需要进行合理的优化分析

 

分析器

如果缓存没有命中或者没用使用缓存,查询语句就会到达分析器,分析器就是一个编程语言的解析器,解析的是SQL语言。分析器的工作主要分为两个部分:

1 词法分析:词法分析时分析器会分析SQL语句中每个用空格或者逗号分割的字符串,把SELECT关键词提取出来,把语句里的标识为表名的字符串对应到MySQL的表,把每一个column对应到表里的字段。

2 语法分析:语法分析就是整个SQL语句是否满足语法要求,满足则能执行成功,不满足则报错。

优化器

优化器的功能一句话就能描述,却非常重要,决定了查询的性能。优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在联表查询时决定用哪一张表关联哪一张表。

执行器

执行器的功能就是调用存储引擎的API存入数据或者取出数据。在调用存储引擎的API之前会先进行权限校验,校验该用户是否有对该表相应的操作权限。存储引擎如果索引没有命中,存储引擎就一条条扫表,直到查到指定的数据,然后返回给server层。如果命中了索引,存储引擎就在索引命中的数据中一条条扫描,直到查到指定的数据。如果索引类型为const类型,那么存储引擎会直接命中,然后返回。

查询语句如何实现

说完了MySQL的架构,我们用一个例子来总结一下一条查询语言是如何实现的

select * from t where id = 123 and name = 'tom'
复制代码

1 客户端与MySQL服务端建立网络连接,连接语句譬如:

mysql -h 127.0.0.1 -P 3306 -u 'name' -p'password!' database_name -A --default-character-set=utf8
复制代码

这条语句指定了MySQL服务器的地址为 127.0.0.1 ,也就是本机,端口号为3306,用户名为name,密码为password。指定库名为database_name,指定默认字符集为utf8。

2 完成连接后,如果开启了MySQL的缓存机制,这时候会先去查询缓存是否命中,如果缓存命中则直接返回缓存中的数据,如果缓存没有命中则继续向下执行。

3 分析器会分析每个词是否是有意义的,比如会解析到 select 是SQL的关键词, t 是表名, id 和 name 是表名中的字段.然后分析SQL的语法是否正常,该条语句可以正常执行。

4 优化器会分析在字段 id 和 name 上是否有索引,应该选择哪个索引。如果表 t 是以 id 为主键,那么分析器就会直接走主键索引了。

5 执行器开始执行前会先校验该用户是否有对该的读权限。通过权限校验后,执行器会调用存储引擎的API查询出这条数据,返回给客户端。

更新语句如何实现

一条更新语句的执行也要经历一条查询语句所要经历的几个阶段,连接器建立连接、分析器分析语法、优化器选择索引,执行器调用存储引擎的API,与查询语句相比,更新语句更为复杂,因为MySQL的InnoDB引擎要保证在数据库机器宕机以后数据不丢失。

同样以一个例子来总结查询语句是如何实现的

update t set name = 'tom' where id = 123
复制代码

1 客户端与MySQL服务端建立网络连接

2 分析器解析出这是一条更新语句

3 优化器选择主键索引,假设以 id 做该表的主键

4 执行器首先查询内存中是否有表 t 中 id 等于123的这一行数据,如果没有则通过存储引擎将这行数据取到内存中

5 执行器修改 name 字段为tom,得到一个新的行

6 存储引擎将新行的数据写入内存,并写redo log日志, 此时 redo log 处于 prepare 状态

7 执行器写bin log日志

8 存储引擎修改redo log日志为commit状态

MySQL语句是怎么实现的?需要进行合理的优化分析

 

以上步骤就是一个完整的更新语句执行过程,细心的读者会发现更新的数据只写入到内存,还没有持久化到磁盘,mysql异步定期将内存中的数据写入到磁盘,这一过程和操作系统的文件系统读写很像,文件系统中有一个page cache,写文件时先写cache然后用一个独立的进程将数据刷到磁盘。mysql使用了redo log日志,因此即使服务器宕机,数据也不会丢失,可以从redo log日志中恢复。

 

redo log日志与bin log日志

1 redo log日志是由server层来写,bin log日志由存储引擎来写的;

2 redo log 是物理日志,记录的是“在某个数据页上做了什么修改",bin log用于记录逻辑操作。在statement模式时,bin log记的就是SQL语句;

3 redo log日志循环写的,空间用完后,要先将数据刷到磁盘,然后清理空间。bin log日志是追加写入的;

4 redo log日志用于数据库崩溃后恢复数据,而bin log日志则用于主备同步,数据备份等;
 



Tags:MySQL   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
作者:雷文霆 爱可生华东交付服务部 DBA 成员,主要负责Mysql故障处理及相关技术支持。爱好看书,电影。座右铭,每一个不曾起舞的日子,都是对生命的辜负。 本文来源:原创投稿 *爱可生...【详细内容】
2021-12-24  Tags: MySQL  点击:(7)  评论:(0)  加入收藏
一、为什么要搭建主从架构呢1.数据安全,可以进行数据的备份。2.读写分离,大部分的业务系统来说都是读数据多,写数据少,当访问压力过大时,可以把读请求给到从服务器。从而缓解数据...【详细内容】
2021-12-15  Tags: MySQL  点击:(12)  评论:(0)  加入收藏
生成间隙(gap)锁、临键(next-key)锁的前提条件 是在 RR 隔离级别下。有关Mysql记录锁、间隙(gap)锁、临键锁(next-key)锁的一些理论知识之前有写过,详细内容可以看这篇文章...【详细内容】
2021-12-14  Tags: MySQL  点击:(18)  评论:(0)  加入收藏
binlog 基本认识 MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二...【详细内容】
2021-12-14  Tags: MySQL  点击:(13)  评论:(0)  加入收藏
为查询优化你的查询 大多数的MySQL服务器都开启了查询缓存。这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的。当有很多相同的查询被执行了多次的时候,这些查...【详细内容】
2021-12-09  Tags: MySQL  点击:(15)  评论:(0)  加入收藏
测试的目的和原因,公司有很多程序员,每个程序员对数据库和表结构都有自己的理解。而且每个程序员的理解往往是以效率考虑。既然都是为了效率考虑,那么我就来测试一下究竟哪种使...【详细内容】
2021-12-08  Tags: MySQL  点击:(14)  评论:(0)  加入收藏
当你们考虑项目并发的时候,我在部署环境,当你们在纠结使用ArrayList还是LinkedArrayList的时候,我还是在部署环境。所以啊,技术不止境,我在部环境。今天这篇文章缕一下在同一台服...【详细内容】
2021-12-08  Tags: MySQL  点击:(17)  评论:(0)  加入收藏
对于数据分析来说,MySQL使用最多的是查询,比如对数据进行排序、分组、去重、汇总及字符串匹配等,如果查询的数据涉及多个表,还需要要对表进行连接,本文就来说说MySQL中常用的查询...【详细内容】
2021-12-06  Tags: MySQL  点击:(21)  评论:(0)  加入收藏
在学习SQL语句之前,首先需要区分几个概念,我们常说的数据库是指数据库软件,例如MySQL、Oracle、SQL Server等,而本文提到的数据库是指数据库软件中的一个个用于存储数据的容器。...【详细内容】
2021-11-24  Tags: MySQL  点击:(23)  评论:(0)  加入收藏
概述以前参加过一个库存系统,由于其业务复杂性,搞了很多个应用来支撑。这样的话一份库存数据就有可能同时有多个应用来修改库存数据。比如说,有定时任务域xx.cron,和SystemA域...【详细内容】
2021-11-05  Tags: MySQL  点击:(31)  评论:(0)  加入收藏
▌简易百科推荐
作者:雷文霆 爱可生华东交付服务部 DBA 成员,主要负责Mysql故障处理及相关技术支持。爱好看书,电影。座右铭,每一个不曾起舞的日子,都是对生命的辜负。 本文来源:原创投稿 *爱可生...【详细内容】
2021-12-24  爱可生    Tags:MySQL   点击:(7)  评论:(0)  加入收藏
生成间隙(gap)锁、临键(next-key)锁的前提条件 是在 RR 隔离级别下。有关Mysql记录锁、间隙(gap)锁、临键锁(next-key)锁的一些理论知识之前有写过,详细内容可以看这篇文章...【详细内容】
2021-12-14  python数据分析    Tags:MySQL记录锁   点击:(18)  评论:(0)  加入收藏
binlog 基本认识 MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二...【详细内容】
2021-12-14  linux上的码农    Tags:mysql   点击:(13)  评论:(0)  加入收藏
为查询优化你的查询 大多数的MySQL服务器都开启了查询缓存。这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的。当有很多相同的查询被执行了多次的时候,这些查...【详细内容】
2021-12-09  元宇宙iwemeta    Tags:mysql   点击:(15)  评论:(0)  加入收藏
测试的目的和原因,公司有很多程序员,每个程序员对数据库和表结构都有自己的理解。而且每个程序员的理解往往是以效率考虑。既然都是为了效率考虑,那么我就来测试一下究竟哪种使...【详细内容】
2021-12-08  吴彬的分享    Tags:Mysql数据库   点击:(14)  评论:(0)  加入收藏
当你们考虑项目并发的时候,我在部署环境,当你们在纠结使用ArrayList还是LinkedArrayList的时候,我还是在部署环境。所以啊,技术不止境,我在部环境。今天这篇文章缕一下在同一台服...【详细内容】
2021-12-08  秃头码哥    Tags:MySQL数据库   点击:(17)  评论:(0)  加入收藏
对于数据分析来说,MySQL使用最多的是查询,比如对数据进行排序、分组、去重、汇总及字符串匹配等,如果查询的数据涉及多个表,还需要要对表进行连接,本文就来说说MySQL中常用的查询...【详细内容】
2021-12-06  笨鸟学数据分析    Tags:MySQL   点击:(21)  评论:(0)  加入收藏
在学习SQL语句之前,首先需要区分几个概念,我们常说的数据库是指数据库软件,例如MySQL、Oracle、SQL Server等,而本文提到的数据库是指数据库软件中的一个个用于存储数据的容器。...【详细内容】
2021-11-24  笨鸟学数据分析    Tags:SQL语句   点击:(23)  评论:(0)  加入收藏
概述以前参加过一个库存系统,由于其业务复杂性,搞了很多个应用来支撑。这样的话一份库存数据就有可能同时有多个应用来修改库存数据。比如说,有定时任务域xx.cron,和SystemA域...【详细内容】
2021-11-05  Java云海    Tags:分布式锁   点击:(31)  评论:(0)  加入收藏
MySQL的进阶查询 一、 按关键字排序 使用ORDERBY语句来实现排序排序可针对一个或多个字段ASC:升序,默认排序方式 【升序是从小到大】DESC:降序 【降序是从大到小】ORDER BY的...【详细内容】
2021-11-05  Java热点    Tags:SQL语句   点击:(28)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条