初入Mysql底层(一)

初入Mysql底层

一个查询sql的执行流程,大致如下:

初入Mysql底层(一)

(一)连接sql

  • 连接池:ip验证,用户授权,连接数限制等
  • 有两种连接方式:TCP/IP、Unix Socket
  • 一般客户端连接sql,采用TCP/IP方式连接。mysql默认端口3306。
  • 每执行一次sql语句,就会有一次TCP请求,将客户端拼接好的sql语句发送到服务端。
  • 查看sql进程数:show global status like 'Thread%''
  • 查看连接超时时间:show variables like 'wait_timeout'
  • 查看最大连接数:show variables like 'max_connections'

(二)sql接

  • 接收客户端发送过来的sql指令

(三)缓存

  • 为了方便,sql这里会把每次的查询接口放到缓存里,方便下次使用。
  • 先去缓存里面匹配结果,如果匹配上了,就直接返回客户端结果。
  • 查看缓存:show variables like 'query_cache%'

(四)解析器

  • 分为词法解析、语法解析。
  • 词法解析:简单来说就是把你的sql语句打碎成一个一个的单词,这里面包含一些关键字,一些变量等。
  • 语法解析:就是分析你的sql语句的语法是否正确,是否符合规范。
  • 做完词法、语法解析之后,还会进行一步额外的操作:预处理器,这步会读取你的表结构来验证你的sql语句是否正确,比如:会验证你的表名是否存在,你的字段是否存在等等。
  • 解析后,最后会得到一个解析树。

(五)优化器

  • 会拿到刚才解析完的解析树,进行优化,得到一个执行计划的数据结构。
  • 一个sql语句,会有多个执行路径,或者说是执行方式,只是所有的执行方式得到结果一样而已。
  • 优化器会选择一个成本(cost)比较低的执行方式去执行这个sql语句。
  • 查看上一个sql语句的执行成本:show status like 'Last_query_cost'

(六)执行器

  • 按照刚才得到的执行计划,调用存储引擎的接口,来执行sql语句。

(七)存储引擎

  • 提供读写sql的接口,让执行器去调用。
  • 比较常见的存储类型有:InnoDB、MyISAM、Memory。
  • InnoDB类型:支持事务处理,支持外键,支持行级别的锁操作,能支持更高的并发等。
  • MyISAM类型:拥有较高的插入、查询速度,但不支持事务,不支持外键。
  • Memory类型:将数据存在内存,为了提高数据的访问速度。由于数据是存放在内存中,一旦服务器出现故障,数据都会丢失。

(八)返回客户端

  • 将执行sql的结果返回给客户端。
  • 如果开启了缓存,则需要将数据存入缓存,再返回给客户端。