资讯专栏INFORMATION COLUMN

MySql之sql执行过程

geekzhou / 1455人阅读

摘要:概述是一个关系型数据库管理系统,由瑞典公司开发,目前属于旗下产品。是最流行的关系型数据库管理系统之一,在应用方面,是最好的,关系数据库管理系统应用软件。优化器经过分析器之后,就知道你需要做什么,在执行之前还要经过优化器的处理。

概述

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。

执行过程
编写Sql语句基本是程序开发中的日常,执行Sql在MySql中都经历了哪些过程呢?例如:select * from user where id=1
1.连接器
负责与客户端建立连接、获取权限、位置和管理连接。

连接命令:

 mysql -h$ip -P$port -u$user -p

环节:

  1. TCP握手       
  2. 认证你的身份
  3. 获取权限

2.查询缓存
当连接建立完成后就开始执行 select 语句,执行逻辑就会来到第二步:查询缓存

MySql 在执行查询时会先对查询缓存进行查询,是否之前执行过此查询,之前执行过的语句会以key-value形式,被直接缓存在内存当中key为语句,value是查询结果,查询后2种结果:

 1. 查询缓存命中:直接返回结果(效率很高)
 2. 查询缓存未命中: 继续直行后面的阶段,执行完成后,执行结果会被存入查询缓存中

大多数情况下我会建议你不要使用查询缓存,为什么呢?因为查询缓存往往利大于弊

查询缓存的失效非常频繁,只要有对一个表的更新,整个表上的查询缓存都会被清空,对于更新频繁的表使用查询缓存命中率就会很低,对于更新比较少的静态表则很适用。

按需使用:

将MySQL参数 query_cache_type 设置为 DEMAND 这样SQL语句都不会使用缓存,对于需要使用查询缓存的查询语句可以用SQL_CACHE显示指定。(MySQL8.0 已经将查询缓存模块移除)
mysql> select SQL_CACHE * from user where id=1

3.分析器
如果没有命中查询缓存,就要开始真正执行语句了。

首先 Mysql 需要 知道你要执行什么,所以要对sql语句做解析

词法分析

 你输入的是由多个字符串和空格组成的一条 SQL 语句,MySQL 需要识别出里面的字符串分别是什么,代表什么。
 MySQL 从你输入的"select"这个关键字识别出来,这是一个查询语句。它也要把字符串“T”识别成“表名 T”,
 把字符串“ID”识别成“列 ID”
 

语法分析

 根据词法分析的结果,语法分析器会根据语法规则,判断你输入的这SQL语句是否满足 MySQL 语法。
 如果你的语句不对,就会收到“You have an erroin your SQL syntax”的错误提醒,比如面这个语句 select 少打了开头的字母“s”。

mysql> elect * from t where ID=1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use naer "elect * from t where ID=1" at line 1

4.优化器
经过分析器之后,MySQL就知道你需要做什么,在执行之前还要经过优化器的处理。

优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的链接顺序,例如这个语句执行两个表的join:

 mysql> select * from t1 join t2 using(ID) where t1.c=10 and t2.d=20 

既可以先从t1里面取出c=10的记录的Id值,再根据Id值关联到表t2,在判断t2 里面d的值是否等于20

也可以先从t2里面取出d=2的记录值Id值,再根据Id值关联到表t1,在判断t1 里面d的值是否等于10

两种方法逻辑和结果相同,但是执行效率会有不同,优化器就是要决定使用哪一种方案。

5.执行器
到这里Mysql已经知道你想要做什么了,优化器也帮你优化了知道该怎么做了,那么就开始执行语句吧。

执行语句需要:

判断你是否有查询权限有就继续执行没有就返回权限错误

执行器根据表的引擎定义去掉用引擎接口(例:InnoDB)

无索引:

调用innoDB引擎接口取出这个表的第一行,判断ID是否等于1,如果不是则跳过,如果是则将这行存在结果集中;

调用引擎接口取 ‘下一行’ 执行相同判断逻辑,直到取到表的最后一行

执行器将所有满足条件的行 组成的记录作为结果集返回给客户端

有索引

与无索引逻辑差不多,第一次调用的是“取满足条件的第一行”这个接口,之后循环的是“满足条件的下一行”这个几口,接口在引擎中已经定义好。

致谢
在这里非常感谢·林晓斌·老师在极客时间发布的文章,让自己对数据库有了一个好的理解。感谢各位观众的耐心观看,如有错误请指正,谢谢!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/48195.html

相关文章

  • Mysql存储过程与存储函数

    摘要:用于指定存储过程中的参数列表。语法项表示存储过程的主体部分,也成为存储过程体,其包含了需要执行的。是函数体,所有存储过程中的在存储函数中同样可以使用。注释信息,用来描述存储过程或函数。1 存储过程 1.1 什么是存储过程 存储过程是一组为了完成某项特定功能的sql语句集,其实质上就是一段存储在数据库中的代码,他可以由声明式的sql语句(如CREATE,UPDATE,SELECT等语句)和过...

    Shisui 评论0 收藏0
  • MySQL数据库运维主从复制延迟问题排查

    摘要:这个参数表示事务执行完成之后,多久的频率刷新一次日志到磁盘上,可用的值有如下几种表示会将日志缓冲区中的数据每秒一次地写入日志文件中,并且日志文件的刷盘操作同时进行。 上篇文章介绍了单机环境下的MySQL主从异步复制和主从半同步复制的搭建过程。搭建过程很简单,但是在实际使用过程中,更多的是解决问题,本篇文章将介绍一下MySQL主从复制中常见的问题以及如何定位问题和如何解决问题。 一、从库...

    xumenger 评论0 收藏0
  • 干货 | MySQL数据库安全审计

    摘要:相比传统数据库,云数据库易于部署管理和扩展,提供数据可靠性安全性运行状态监控等全套解决方案。下面给大家介绍云数据库审计的开启使用关闭等功能。 每家公司都希望业务高速增长,最好能出几个爆款产品或者爆款业务,从而带动公司营收高速攀升。但站在数据库管理员的角度,这却是实实在在的压力,业务高速增长必然带来数据量的暴增。数据库系统的选型和设计是支撑整个业务系统的重要因素。MySQL数据库是基于云...

    tigerZH 评论0 收藏0
  • MySQL数据库DDL操作存储过程和函数

    摘要:上篇文章介绍了数据库操作中的触发器,本章将详细介绍数据库操作中的存储过程和函数,存储过程和函数在某些复杂业务场景下还是有很大作用的。定义和作用存储过程和函数是数据库中预先编译好的一个为了完成特定功能的语句集。 上篇文章介绍了MySQL数据库DDL操作中的触发器,本章将详细介绍MySQL数据库DDL操作中的存储过程和函数,存储过程和函数在某些复杂业务场景下还是有很大作用的。 1、定义和作...

    venmos 评论0 收藏0
  • PHP面试MySQL数据库部分基础知识

    摘要:生成订单并且保存到数据库中。触发器是在响应数据定义语言事件时执行的存储过程。利用触发器记录所进行的修改以及相关信息,跟踪用户对数据库的操作,实现审计。预告本周三将更新面试数据库的索引,敬请期待。 你好,是我琉忆,PHP程序员面试笔试系列图书的作者。 本周(2019.3.4至3.8)的一三五更新的文章如下: 周一:PHP面试MySQL数据库的基础知识周三:PHP面试MySQL数据库的索...

    dunizb 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<