MySQL知识点

MySQL逻辑架构

输入图片说明

MySQL整个逻辑架构整体分为三层:

  • 客户端层,最上层,不是MySQL独有,例如连接处理、授权认证、安全等
  • 核心服务层,包括查询解析、分析、优化、缓存、内置函数等,还有存储过程、触发器、视图等
  • 存储引擎,最下层,负责MySQL中数据的存储和提取

MySQL查询过程

如果希望MySQL提高查询性能,最好的办法是弄清楚MySQL是如何优化和执行查询的,就会发现:很多的查询优化工作,实际上就是遵循一些原则,让MySQL的优化器能够按照预想的合理方式运行而已

输入图片说明

客户端与服务端通信协议

MySQL客户端与服务端的通信协议是“半双工”的:任意时刻,要么是服务端向客户端发送数据,要么是客户端向服务器发送数据,这两个动作不能同时发生,所以我们无法也无须将一个消息切成小块独立发送,也没有办法进行流量控制。

查询缓存

在解析一个查询语句前,如果查询缓存是打开的,那么MySQL会检查这个查询语句是否命中缓存中的数据。如果当前查询恰好命中查询缓存,这种情况下,查询不会被解析,也不会生成执行计划,更不会执行。

如果查询语句中包含任何用户自定义函数、存储函数、用户变量、临时表或者MySQL库中的系统表,其查询结果不会被缓存。

在任何的写操作时,MySQL必须将对应表的所有** **。如果查询缓存很多或者碎片很多时,这个操作可能带来很大的系统消耗,甚至导致系统僵死一会。而且查询缓存对系统的额外消耗也体现在读操作。

语法解析和预处理

语法解析

MySQL通过关键字将SQL语句进行解析,并生成一颗对应的解析树,该过程,解析器主要通过语法规则来验证和解析,比如SQL中是否使用了错误的关键字或者关键字的顺序是否正确等。

预处理

预处理,根据MySQL规则进一步检查解析树是否合法,比如检查要查询的数据表或列是否存在等。

查询优化

多数情况下,一条查询可以有多种执行方式,都返回相应的结果。优化器的作用,是找到其中最好的执行计划。

MySQL使用基于成本的优化器,它尝试预测一个查询使用某种执行计划时的成本,并选择其中成本最小的一个。可以通过查询当前会话的last_query_cost的值来得到其计算当前查询的成本。如:

mysql>select * from t_msg limit 10;

mysql>show status like 'last_query_cost';

查询过程总结

  • 客户端向MySQL服务器发送一条查询请求
  • 服务器首先检查查询缓存,如果缓存命中,则立刻返回缓存中的数据。否则进入下一阶段
  • 服务器进行SQL解析、预处理,再由优化器生成对应的执行计划
  • MySQL根据执行计划,调用存储引擎的API进行数据查询
  • 将结果返回给客户端,同时缓存查询结果

知识点

  1. 当查询语句很长时,需要设置max_allowed_packet参数
  2. 服务端响应给客户端的数据,由多个数据包组成。在实际开发中,尽量保持查询简单且只返回必须的数据,减小通信间数据包的大小和数量是一个非常好的习惯,这也是查询中尽量避免使用SELECT * 以及加上LIMIT限制的原因之一。
  3. 用多个小表代替一个大表,但是不要过度设计
  4. 批量插入,代替循环单条插入
  5. 可以通过SQL_CACHE和SQL_NO_CACHE来控制某个查询语句是否需要进行缓存

猜你喜欢

转载自my.oschina.net/u/1251536/blog/1633307