丁奇-MySQL实战读书笔记1
这个专栏的内容是我工作以来看过讲MySQL最深入而且最细致的,作者丁奇是前阿里资深技术专家,和褚霸(霸爷)一起研究数据库7年之久,我觉得很有必要把这个专栏重新读一下并做好笔记,以求共勉。
特别注意由于丁奇在数据库领域比较资深,所以很多知识他可能认为你至少应该是了解的,如果完全不了解某个知识点,建议先去网上找找资料,对知识点有个大致的轮廓。
专栏地址:
https://time.geekbang.org/column/intro/139
首先是MySQL的基本架构示意图:
image.png
存储引擎层:
现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。
连接器:
mysql -h$ip -P$port -u$user -p
连接器判断用户名和密码,强烈建议密码不要直接加载-p后面,不安全。连接器在连接建立之后授予用户权限,就算用户修改了权限,本次连接中也不会生效。
客户端如果太长时间没动静,连接器就会自动将它断开。这个时间是由参数 wait_timeout 控制的,默认值是 8 小时。
长期使用长连接可能会导致连接对象内存暴涨(因为内存释放是在连接断开之后),如果你用的是 MySQL 5.7 或更新版本,可以在每次执行一个比较大的操作后,通过执行mysql_reset_connection 来重新初始化连接资源。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态。
查询缓存
执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。key 是查询的语句,value 是查询的结果。
不要使用查询缓存,因为查询缓存往往弊大于利。
只要有对一个表的更新,这个表上所有的查询缓存都会被清空。除非你的业务就是有一张静态表,很长时间才会更新一次。MySQL 8.0 版本直接将查询缓存的整块功能删掉了
建议使用案例:
将参数 query_cache_type 设置成 DEMAND,这样对于默认的 SQL 语句都不使用查询缓存。
mysql> select SQL_CACHE * from T where ID=10;
分析器
词法分析 - 识别出里面的字符串分别是什么,代表什么
语法分析 - 判断你输入的这个 SQL 语句是否满足 MySQL 语法
优化器
优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。
课后练习题:
如果表 T 中没有字段 k,而你执行了这个语句 select * from T where k=1, 那肯定是会报“不存在这个列”的错误: “Unknown column ‘k’ in ‘where clause’”。你觉得这个错误是在我们上面提到的哪个阶段报出来的呢?
分析器,《高性能mysql》里提到解析器和预处理器。
解析器处理语法和解析查询, 生成一课对应的解析树。
预处理器进一步检查解析树的合法。比如: 数据表和数据列是否存在, 别名是否有歧义等。如果通过则生成新的解析树,再提交给优化器。