一、当你按下回车键,一条查询语句会经历什么过程?

写在前面

   当你敲出 select * from table where id = 1; Mysql都干了啥?所以说作为一个Mysql的重度使用的开饭人员,我们不仅需要写出很好的SQL语句。更要了解Mysql的工作流程。

Mysql基本结构

总的来说,我理解Mysql由客户端和服务端构成。而服务端由可以分为server层和存储引擎层两部分。接下来我们就讨论下服务端的两层结构。
如下图:

  1、连接器

  负责跟客户端建立连接、获取权限、管理连接等。
  比如: mysql -uroot -h127.0.0.0.1  -P3306 -p
  mysql 是客户端工具,进行tcp连接后,验证输入用户的合法性。

  * 账密不对,直接返回 Access denied for user XXX的错误,并结束。
  * 账密正确,需要验证当前用户的权限,具体在 mysql库 User 表中体现。
  
  笔记点:当一个有读写权限的用户连接数据库,期间更改了此用户只用读权限。不会立即生效,需要重新连接才会生效。

  2、缓存查询

  当连接完成、便来到查询缓存这一步。当拿到一个select语句时候,会先看是否执行过该条语句。若执行过则可能会以key-value的形式存储在内存中。若在内存中找到则直接返回。
  如果没有缓存则执行接下来的流程,执行完以后也会缓存到内存(当然需要开启缓存)。
  
  当然了凡事都有利弊,当你的表是频繁更新的话,不建议开启缓存。

  Mysql提供一种按需使用的方式,就是将参数 query_cahce_type 设置为DEMAND, 这样默认就不会缓存结果。但是可以显式指定需要缓存的语句。 
  如: select SQL_CAHE * from table where id = 1;

  笔记点:Mysql8 取消了查询缓存这一块的功能。
  
  3、分析器
  
  这个就是1、分析sql的词法:如select 是查询、delete 是删除... 表名、字段名等。 2、语法分析:比如分析select 是不是打成了 selec这种。
  
  笔记点:当你看到 you have an error in your SQL syntax 提示。建议直接查看 user near 后面的内容。
  
  4、优化器
        
  分析器告诉了mysql你要做什么,优化器的作用是怎么做更好。比如索引的选取、连表顺序等。这个后面再细说。      

  5、执行器
  
  调用引擎提供的接口操作数据。如我们的查询,执行器会先判断当前用户是否有查询的权限,若没有则抛出错误,有则执行查询。

写在最后

敲字不易,转载请注明来源。谢谢!

posted @ 2020-05-24 21:40  一七令  阅读(147)  评论(0编辑  收藏  举报