极客时间《MySQL实战》专栏的学习收获html
最近刚刚购买了极客时间的课程《MySQL实战45讲》,我会在这里将学习到的知识点作一个总结。mysql
本节主要是讲MySQL的基础架构。好比执行如下语句时:git
mysql> select * from T where ID=10;
复制代码
这条语句在MySQL内部是如何处理的。github
Server包括:链接器、缓存查询、分析器、优化器、执行器。存储过程、触发器、视图等功能都在Server层处理。sql
存储引擎负责数据的存储和提取。常见的有InnoDB、MyISAM。数据库
链接器与客户端创建链接、获取权限、维持和管理链接。缓存
常见的命令:服务器
mysql -uroot -ppassword架构
用来和服务器创建链接,TCP握手后完成认证过程。post
只有在链接过程才会从权限表中读取权限信息,中途对权限的修改不会影响已经创建的链接,只有从新登录后才会使用新的权限信息。
创建链接后若是长时间处于空闲状态,"show processlist"
命令能够看到处处于sleep状态的链接。
若规定时间内无活动,则会自动断开链接。规定时间 由 wait_timeout
控制,默认为8小时。断开后,再次发请回会提示 "Lost connection to MySQL server during query"
,只能从新链接。
防止数据库中出现占用大量内存的状况,能够用一下方法解决:
"mysql_reset_connection"
命令来初始化链接资源,该操做不会重连和从新获取受权,只是恢复到刚创建链接的状态。创建链接后,就能够执行select操做,这是会执行第二部分:查询缓存。
一个请求进来,首先查询缓存,是否存在该记录。以前执行过的语句,则会以语句为key,执行后的结果集为value存储在内存中。
不建议使用查询缓存,此操做弊大于利 ( MySQL8.0后将会删除该功能 )
对于一个表,只要有更新便会将涉及到该表的缓存所有清空。
只适用于不常更新的静态表
推荐:
-将query_cache_type 设置为 DEMAND,默认SQL不使用查询缓存,针对须要查询缓存的语句,使用SQL_cache显示指定,例如:
select SQL_CACHE * from T where ID = 10;
复制代码
这条SQL要作什么
"select"
得出这是一条查询语句,根据"from T"
识别表T,将"ID"
识别为列名。"You have an error in your SQL syntax..."
,后面是错误的地方,须要你关注"use naer"
后的内容。这条SQL如何作
这个步骤将会选取最优的执行方式,例如:
select * from t1 join t2 using(ID) where t1.c=10 and t2.d=20;
复制代码
该步骤决定了先从t1表中取出c=10的ID值仍是先查找出t2表中d=20的ID值。真正的执行步骤
根据链接器取到的权限判断,是否对表T有权限。
打开表后,根据表的引擎定义,使用引擎提供的接口。 例:
表T中ID字段无索引:
表T中ID字段有索引:
"获取知足条件的第一行"
接口,server层还会再判断一次值是否正确,而后放入结果集,接着继续访问"知足条件的下一行"
接口,这些接口是引擎已经定义好的。在MySQL的慢查询日志中,rows_examined字段表示该语句执行过程当中扫描了多少行,这个值就是调用引擎获取数据行的时候添加的。
某些场景下,执行器调用一次,引擎内部会扫描不少行,所以引擎扫描行数跟rows_examined并不彻底相同,这一点后文会详细说明。
评论区知识点:
问题:若是查询语句中的字段不存在,会在哪一个阶段报错?
Connect_timeout 指的是“链接过程当中”的等待时间
wait_timeout指的是“链接完成后,使用过程当中”的等待时间
本文中含有极客时间《MySQL实战》的图和部分原文,若有侵权,请联系我马上删除
第二节:MySQL系列之一条更新SQL的生命历程