一、Mysql执行查询流程
mysql执行查询的流程
mysql执行查询内部路程:1.客服端发送一条查询给服务器
2.服务器先检查查询缓存,如果命中缓存,立刻返回存储在缓存的结果,否则进入下一阶段。
3.服务器端进行sql解析,预处理,再由优化器生成对应的执行计划。
将一个SQL转换成一个执行计划,MySQL再依照这个执行计划和存储引擎进行交互,者包括多个子阶段,解析SQL,预处理,优化sql执行计划。
4.mysql根据优化器生成的执行计划,调用存储引擎的api来执行查询
5.将结果返回给客户端。
优化数据访问: 1、只查询需要的记录,如使用limit等
2、多表关联时不要返回全部列
3、查询不取出全部列
4、不要重复查询相同的数据:不断重复执行相同的查询,然后每次都返回相同的数据,比较好的方案是,当初次查询的时候将这个数据缓存起来,需要的时候从缓存中取出。
对于MySQl,最简单的衡量查询开销的三个指标如下:
响应时间
扫描的行数
返回的行数
语法解析器 : Mysql通过关键字将SQL语句进行解析,并生成一棵对应的“解析树”。MySQL解析器将使用mysql语法规则验证和解析查询。 如:验证是否使用错误的关键字,或者使用关键字的顺序是否正确等。或者它还会验证引号是否能前后正确匹配。
预处理器 :根据一些MySQL规则进一步检查解析树是否合法。如:检查数据表和数据列是否存在,还会解析名字和别名,看看它们是否有歧义。
查询优化器:使用基于成本的优化器,尝试预测一个查询使用某个执行计划的成本,并选择成本最小的一个。
使用很多优化策略来生成一个最优的执行计划,优化策略可以简单地分为,一种静态优化,一种动态优化。
静态优化可以直接对解析树进行分析,并完成优化。静态优化不依赖特别的值,如where条件带入的一些常数等。
动态优化则和查询的上下文有关。跟其他因素有关,如WHERE条件中的取值,索引中条目对应的数据行数等。
MySQL能够处理的优化类型:
1、重新定义关联表的顺序
优化器不总是按查询中指定的顺序。
2、将外连接转化成内连接
不是所有的outer