mysql性能优化:MySQL的执行工作原理

客户端请求由Nginx等负载均衡服务器转交给Tomcat,Tomcat从MySQL中捞取数据,如果请求的数据在MySQL缓存中,那么MySQL会将缓存中捞取到的数据返回给客户端。
  如果缓存中没有请求的数据,那么MySQL会通过解析器解析SQL语句是否有问题(语法、用户权限问题等),在SQL语法没有问题的情况下,将SQL转交给优化器,看SQL是否通过索引等来进行查询,再通过存储引擎在磁盘中捞取数据。
  MySQL的执行工作原理

详细流程如下,对于IE–>TOMCAT–>MySQL的流程,客户端请求在到达Tomcat后,经历路程如下:
  ①先在Tomcat的JVM中捞取数据,如果捞取到对应数据,请求直接返回;
  ②在MySQL缓存(缓存数据集、SQL语法、表定义、表权限、字段)中查询数据,若查询到,MySQL在将缓存中查询到的数据返回给应用缓存时,会校验一遍用户权限,此时校验用户权限不会走解析器;若没有命中缓存,就会来到解析和预处理环节。
  ③将SQL交给MySQL的第二层对SQL语句的语法进行解析,该层包括解析器以及预处理器。这里的解析可以分为硬解析和软解析,在SQL语法没有问题的情况下,执行下一步操作。
  解析器:也叫语法解析器,SQL语句经过解析器解析之后,会生成一颗对应的解析数,在解析器中,MySQL会使用语法规则验证和解析查询,例如是否使用错误的关键字、使用关键字的顺序是否正确、验证引号是否能正确匹配等。
  预处理器:在预处理其中,进一步解析解析数是否合法并生成一颗新的解析数。例如:检查数据表和数据列是否存在,SQL语句的名字和别名是否有歧义,之后预处理器还会校验用户权限(权限校验一般会很快,除非服务器上有非常多的权限设置)。
  硬解析:通过硬件监听,例如SELECTFROMSTUDENTWHEREid=‘test001’,解析SQL语句以及对应操作用户的权限,对于一个类型的SQL,在第一次查询的过程中,都是硬解析,查询速度较慢。
  软解析:在查询SELECT
FROMSTUDENTWHEREid='test002’时,当第二次使用查询student这张表,并再次用id这个字段作为检索字段时,此时这条SQL已经缓存下来,该SQL被缓存成如下形式:SELECTFROMSTUDENTWHEREid=$,第二次查询时,就不需要消耗CPU去解析这这条SQL的语法,从而降低CPU的消耗。
  需要注意的是,MySQL缓存需要整个SQL语句全部命中,而软解析,当MySQL只是变量变化时,就会利用已有的解析数和执行计划。
  ④在生成了解析树之后,便来到查询优化器这一层,在查询优化器中,将解析数转化为执行计划,一般一条查询语句可以由多种执行计划完成,优化器的工作是从这些执行方式中找到性能最好的执行计划。
  全表扫描:SELECT
FROMTABLE_NAMEWHERE…,将一张表无论什么样的数据,都全部一次性从硬盘中捞出来,这样的方式,在表中数据量较大的情况下,磁盘IO会比较大,造成CPU使用率较高(监听IO事件)。
  ⑤找到最优的执行计划以后,MySQL调用查询执行引擎(InnoDB、MyISAM)在磁盘中捞取数据。
  推荐阅读:mysql性能调优:B+Tree的基本介绍
  如果你想了解更多关于java架构师的专业知识,可以加入JAVA架构师交流群:1037935907,里面都是同行,有资源分享包括但不限于(分布式架构、高可扩展、高性能、高并 发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、Mysql 、Zookeeper、Tomcat、Docker、Dubbo、Nginx)。欢迎一到五年的工程师加入,合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

猜你喜欢

转载自blog.csdn.net/weixin_49698883/article/details/111587982