MySQL Internals Optimizer
L:顺序扫描整个表数据
源代码见/sql/sql_select.h,enum join_type{}。另外,还有一小部分没记录在档,为了子查询的JOIN联接类型。
优化器利用JOIN联接类型选择一个驱动表达式,如下: SELECT *
对驱动来说,什么是最有意义的呢? 如下查询时的两条执行路径:
被索引的搜索通常比顺序扫描调用更少的访问,而且如果访问的表是巨大的,索引又是唯一的,这样表的访问是非常少的。这也是为什么有好执行计划的访问表是更好的,并且这也是为什么常常把indexed_column做为驱动。
联接和访问的方法 在单表搜索中,坏的JOIN联接执行选择比坏的执行选择造成更多的性能损害。所以MySQL开发者发了更多的时间确保查询中的表以一种最佳顺序被联接和此最佳访问方法(常常被称访问路径)被选择作为检查表数据。表联接的固定顺序和相应的所有表的表访问方法的组合,叫做查询执行计划(QEP)。查询优化器的目的就是在所有可能的计划中找出一个最佳的QEP。JOIN联接优先后有一些常规的概念。 每个计划或计划的部分,被定义成COST成本。计划的成本粗略地反映了计算按照计划的查询所需要的资源,其中主要的因素是当计算查询时所以访问的记录总数。一旦我们有办法分配到不同的成本QEPs,我们有办法对它们进行比较。这样,优化器的目的就是在所有可能的计划中找到一个成本最低的QEP。
在MySQL中,实现了最佳QEP搜索是自下而上的方式。优化器首先确认一张表的所有计划,接着两张表的所有计划,以此类推,直到建立一个完整的最佳QEP。查询计划包括在查询中只有部分表和限定(predicates),被称为部分计划(partial plans)。优化器依赖着一点事实:越多表被加到部分计划(partial plans),成本就越高(注:成本高,执行效率就低)。这使得优化器可扩展更多的表只用较低成本的部分计划 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |