快速业务通道

MySQL Internals Optimizer

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-03-18
ef类型访问:


... AND tblY.key_partN = tblX.column AND ...
 tblX.column可以为NULL。ref(或eq_ref)类型访问时,前期会应用NULLs过滤。我们做如下的推断:


(tblY.key_partN = tblX.column)  =>  (tblX.column IS NOT NULL)
 原等式的检查只有在读了表tblX和tblY的当前行记录后。IS NOT NULL限定(predicate)的检查,只有在读了表tblX的当前行记录后。如果在表tblX和tblY的联合排序中有任何


 其它表,IS NOT NULL限定(predicate)的检查就允许我们跳过访问这些表。

 

 这个特性的实现代码如下:


ref分析器(包含方法update_ref_and_keys())通过设置KEY_FIELD::null_rejecting=TRUE检查和标记像上述这种类型的查询等式。
选择JOIN联接排序以后,add_not_null_conds()会增加适当的IS NOT NULL限定(predicate)到适当表的相关条件中。

 

 对所有等式加了IS NOT NULL限定(predicate)是有可能被ref访问类型使用(而不是那些有实际使用的)。然而,目前没这样做。

 

 后期(Late)NULLs过滤

 假设我们有一个表tblX查询计划,是通过ref访问类型被访问:

tblX.key_part1 = expr1 AND tblX.key_part2 = expr2 AND ...
 在调用索引检索前,我们确定任何expri(expr1,expr2,expr3。。。)值是否为NULL。如果是,我们不会调用检索,而是会马上返回没找到匹配数组。


 这个优化方法重用了由前期(early)NULLs过滤产生的null_rejecting属性。这个检查的源代码见:函数join_read_always_key()。

 

 2.分区相关的优化

 这部分讨论MySQL分区相关的优化。MySQL5.1分区相关概念和实现见:Partitioning。

 

 分区裁剪(pruning)

 分区裁剪(partition pruning)的操作,如下定义:

 “提供一个分区表的查询,比对此分区表的DDL语句和查询中的任何WHERE或ON语句,且找出这查询访问的最小分区集。”


 

 这样得到的分区集会比表所有分区的集合小很多,这个分区集也是之后查询语句要用到的。没被加入这个分区集的其它分区,就不会被访问的,也就是说被裁剪掉的分区。正因为这样,查询的执行速度变得更快。


 Non-Transactional Table Engines.??如MyISAM无事务存储引擎,锁会被加在整个分区表。理论上讲,使用分区裁剪(partition pruning)是有可能提高并发,只把锁加在被使用的分区上。但是目前还没实现这功能。

 分区裁剪(part

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号