MySql之sql执行过程

图片描述

概述

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

执行过程

编写Sql语句基本是程序开发中的平常,执行Sql在MySql中都经历了哪些过程呢?例如: select * from user where id=1

1.链接器

负责与客户端创建链接、获取权限、位置和管理链接。
  1. 链接命令:sql

    mysql -h$ip -P$port -u$user -p
  2. 环节:数据库

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

2.查询缓存

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

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

1. 查询缓存命中:直接返回结果(效率很高)
 2. 查询缓存未命中: 继续直行后面的阶段,执行完成后,执行结果会被存入查询缓存中
  1. 大多数状况下我会建议你不要使用查询缓存,为何呢?由于查询缓存每每利大于弊优化

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

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

3.分析器

若是没有命中查询缓存,就要开始真正执行语句了。

首先 Mysql 须要 知道你要执行什么,因此要对sql语句作解析code

  • 词法分析server

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

    根据词法分析的结果,语法分析器会根据语法规则,判断你输入的这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,若是不是则跳过,若是是则将这行存在结果集中;
        • 调用引擎接口取 ‘下一行’ 执行相同判断逻辑,直到取到表的最后一行
        • 执行器将全部知足条件的行 组成的记录做为结果集返回给客户端
      • 有索引

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

致谢

在这里很是感谢·林晓斌·老师在极客时间发布的文章,让本身对数据库有了一个好的理解。感谢各位观众的耐心观看,若有错误请指正,谢谢!
相关文章
相关标签/搜索