mysql数据库系统学习(一)---一条SQL查询语句是如何执行的?
本文基于----MySQL实战45讲(极客时间----林晓斌 )整理----->https://time.geekbang.org/column/article/68319
一、第一节:一条sql查询语句是怎样执行的
5.5.5版本以后,默认使用存储引擎为InnoDB
不使用查询缓存,MySQL8.0没有查询缓存这个功能
总体来说:MySQL分为service层和存储引擎层
1)service层包括:连接器、分析器、优化器、执行器;它涵盖了MySQL大多数核心服务功能,以及所有的内置函数(日期、时间、数学和加密函数),所有跨存储引擎都在这一层实现(触发器、存储过程、视图)
2)存储引擎负责数据的存储和提取,其架构模式是插件式的,包含:InnoDB、MyISAM、Memory等5.5.5版本以后,默认使用存储引擎为InnoDB,选择其他引擎可以在建表时进行选择,不同的存储引擎用的是同一个server层
mysql> select * from T where ID=10;
(1)连接器:建立连接、获取权限、维持和管理连接
mysql -h$ip -P$port -u$user -p
如果通过则开始验证权限:否则 access denied for user
建立连接之后,会保持连接,处于空闲的状态,使用 show processlist 可以查看,如果长时间没动静,连接器会自己断开,wait_timeout 控制,默认为8小时,
长连接是如果连接过后,客户端一直有请求,则一直使用同一个连接,短连接则是每次执行完很少的几次查询之后就断开了,下次查询再重新进行连接;
全使用长连接之后,会大量占用内存,导致oom,解决方案:定期断开长连接,5.7版本之后,执行一个比较大的操作之后,使用mysql_reset_connection 初始化连接资源
(2)查询缓存:MySQL接收到查询缓存之后,会先到缓存看是否执行过相同语句,击中则返回,否则继续往下
一般都不建议使用缓存,8.0之后直接抛弃了这一部分的功能,why?:
查询缓存实效非常频繁,只要对一个表有更新操作,该表的缓存就会被清空;query_cache_type 设置为DEMAND,这样的sql语句都不使用缓存;如需使用,如下:
mysql> select SQL_CACHE * from T where ID=10;
(3)分析器:检查语法,分析语句:
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 near 'elect * from t where ID=1' at line 1
注意near附近的提示查找到错误;
(4)优化器:当表有多个索引的时候,决定使用哪个索引,或者有多个表关联的时候,决定各个表的连接顺序
(5)执行器:当知道你需要做什么时,进入执行阶段,开始执行语句:
mysql> elect * from t where ID=1;
开始执行时,还会判断一下登录用户有没有这张表的查询权限 ,
慢数据中会看到rows_examined ,表示执行了多少次行扫描;