MYSQL优化

79 阅读3分钟

MYSQL逻辑结构

1736140-20210317083545494-952621714.png

  • 客户端:这里指连接MySQL各种形式,如.Net中使用的ADO连接、Java使用JDBC连接等;MySQL是客户端和服务器模式,前提先建立连接,才能传输数据,处理相关逻辑;

  • 业务逻辑:在MySQL内部有很多模块组成,分别处理相关业务逻辑;

    连接管理:负责连接认证、连接数判断、连接池处理等业务逻辑处理;

    查询缓存:当一个SQL进来时,如果开启查询缓存功能,MySQL会优先去查询缓存中检查是否有数据匹配,如果匹配上,就不会再去解析对应的SQL啦,但如果语句中有用户自定义函数、存储函数、用户变量、临时表、mysql库中的系统表时,都不会走缓存; 对于查询缓存来说,在MySQL8.0已经去除,官方回应的是在一定场景上,查询缓存会导致性能上的瓶颈。

    解析器:对于一个SQL语句,MySql根据语法规则需要对其进行解析,并生成一个内部能识别的解析树;

    优化器:负责对解析器得到的解析树进行优化,MySQL会根据内部算法找到一个MySQL认为最优的执行计划,后续就按照这个执行计划执行。所以后续我们分析的就是MySQL针对SQL语句选择出来的最优执行计划,结合业务,根据规则对SQL进行优化,从而让SQL语句在MySQL内部达到真正的最优。

    执行器:得到执行计划之后,就会找到对应的存储引擎,根据执行计划给出的指令依次执行。

  • 存储引擎:数据的存储和提取最后是靠存储引擎;MySQL内部实现可插拔式的存储引擎机制,不同的存储引擎执行不同的逻辑;

  • 物理文件:数据存储的最终位置,即磁盘上;协同存储引擎对数据进行读写操作。

关于MySql的逻辑结构,以上只是简单描述,业务逻辑层的功能模块远不止上面提到的,小伙伴有兴趣可以专门研究一下,这里的目的就是为了体现SQL语句到服务器上时经过的几个关键步骤,方便后续优化的理解。

SQL语句的中关键字执行顺序须知

1736140-20210317083545795-1031418990.png 关键字简述:

  • FROM:确定数据来源,即指定表;
  • JOIN...ON:确定关联表和关联条件;
  • WHERE:指定过滤条件,过滤出满足条件的数据;
  • GROUP BY:按指定的字段对过滤后的数据进行分组;
  • HAVING:对分组之后的数据指定过滤条件;
  • SELECT:查找想要的字段数据;
  • DISTINCT:针对查找出来的数据进行去重;
  • ORDER BY:对去重后的数据指定字段进行排序;
  • LIMIT:对去重后的数据限制获取到的条数,即分页;