一、当你按下回车键,一条查询语句会经历什么过程?
写在前面
当你敲出 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、执行器
调用引擎提供的接口操作数据。如我们的查询,执行器会先判断当前用户是否有查询的权限,若没有则抛出错误,有则执行查询。
写在最后
敲字不易,转载请注明来源。谢谢!