快速业务通道

MySQL Internals Optimizer

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-03-18
L:顺序扫描整个表数据

源代码见/sql/sql_select.h,enum join_type{}。另外,还有一小部分没记录在档,为了子查询的JOIN联接类型。

 

 优化器利用JOIN联接类型选择一个驱动表达式,如下:

SELECT *
FROM Table1
WHERE indexed_column = AND unindexed_column = 6
如果indexed_column有比较好的JOIN联接类型,它更可能成为驱动表达式。对它来说,你也会遇到各种不同的例外,但对这句描述,是第一个简单的优化法则。


 

 对驱动来说,什么是最有意义的呢? 如下查询时的两条执行路径:


最坏执行计划:扫描读表的所有行。这也叫Table1的顺序扫描或简单表扫描。查询每行,检查indexed_column和unindexed_column两列的值是否匹配查询的条件。


最好执行计划: 通过索引,检索哪些有indexed_column = 值的记录。这也叫被索引的搜索。查询每行,检查unindexed_column列的值是否匹配查询的条件。


 

 被索引的搜索通常比顺序扫描调用更少的访问,而且如果访问的表是巨大的,索引又是唯一的,这样表的访问是非常少的。这也是为什么有好执行计划的访问表是更好的,并且这也是为什么常常把indexed_column做为驱动。

 

联接和访问的方法

 在单表搜索中,坏的JOIN联接执行选择比坏的执行选择造成更多的性能损害。所以MySQL开发者发了更多的时间确保查询中的表以一种最佳顺序被联接和此最佳访问方法(常常被称访问路径)被选择作为检查表数据。表联接的固定顺序和相应的所有表的表访问方法的组合,叫做查询执行计划(QEP)。查询优化器的目的就是在所有可能的计划中找出一个最佳的QEP。JOIN联接优先后有一些常规的概念。

 每个计划或计划的部分,被定义成COST成本。计划的成本粗略地反映了计算按照计划的查询所需要的资源,其中主要的因素是当计算查询时所以访问的记录总数。一旦我们有办法分配到不同的成本QEPs,我们有办法对它们进行比较。这样,优化器的目的就是在所有可能的计划中找到一个成本最低的QEP。

 

 在MySQL中,实现了最佳QEP搜索是自下而上的方式。优化器首先确认一张表的所有计划,接着两张表的所有计划,以此类推,直到建立一个完整的最佳QEP。查询计划包括在查询中只有部分表和限定(predicates),被称为部分计划(partial plans)。优化器依赖着一点事实:越多表被加到部分计划(partial plans),成本就越高(注:成本高,执行效率就低)。这使得优化器可扩展更多的表只用较低成本的部分计划

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号