基础架构:一条SQL查询语句是如何执行的?
-
连接器:和客户端建立连接、获取权限、维持和管理连接。mysql -h i p − P ip -P ip−Pport -u$user -p
-
查询缓存:执行select,根据查询请求查看是否执行过。如果执行过的会以键值对的形式缓存在内存中key是查询的语句,value是 查询的结果。如果查询缓存中没有,继续执行后面执行阶段,执行完后,执行结果存储在缓存中。系统配置表适合使用查询缓存。
查询缓存的弊大于利:失效频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空;
设置查询缓存:默认SQL不使用—将参数query_cache_type设置成 DEMAND;
确定使用缓存查询:mysql> select SQL_CACHE * from T where ID=10;
MySQL 8.0版本直接将查询缓存的整块功能删掉。 -
分析器:对SQL语句进行解析。先做词法分析,解析字符串分别是什么,代表什么。接着做语法分析,判断SQL语句是否满足MySQL语法,语句不对,就会收到“You have an error in your SQL syntax”的错误提醒。知道你要做什么。
-
优化器:决定使用哪个索引,决定各个表的连接顺序。即使逻辑结果是一样的,但是执行的效率会有不同,而优化器的作用就是决定选择使用哪一个方案。知道该怎么做。
-
执行器:先判断对表是否有权限,没有返回错误提示。再打开表执行行,使用引擎提供的接口。没有索引的情况下,innodb取第一行判断ID是否相同,不是跳过,是则将这一行存储在结果集中。接着取下一行,执行相同逻辑,直到表的最后一行。执行器将所有满足的行存储到到结果集返回客户端。
慢查询日志中看到一个rows_examined的字段,表示这个语句执行过程中扫描了多少行。这个值就是在执行器每次调用引擎获取数据行的时候累加的。