2011-12-12 61 views
8

handlersocket插件是否意识到桌子上可能的分区? 我还没有找到提到对这个文档,我甚至不知道,如果分区是透明的处理器插座或它的东西,在SQL优化器。Mysql,handlersocket和分区?

回答

12

简短的回答:

HandlerSocket的工作对分区表(这意味着所有的操作都支持)的罚款,但不知道有任何分区。不尝试分区修剪,因此,当handlersocket与分区表一起使用时,性能开销会很大。

龙答:解析器,通用的处理程序,查询优化器:

分区MySQL中不同级别的实现。通用处理程序(ha_partition)为不支持本机的引擎提供分区(除NDB以外的所有引擎)。这个处理程序实现了一种响应模式链:它将自身插入服务器和底层引擎的正常处理程序之间(每个分区一个)。

当执行查询时,处理程序ha_partition转发操作,以对应的所有的每个分区的基本处理程序。这就是为什么你可以对InnoDB,MyISAM等具有相同的分区支持的原因。

在查询优化器中,而不是在ha_partition处理程序中实现了分区修剪(即过滤掉分区中的无用查找/扫描)。所以基本上,当通过ha_partition完成查找时,如果优化程序没有限制分区列表,则在所有分区上执行查找,然后使用合并算法并行读取n个游标。

以下presentation由马蒂亚斯·琼森和的MikaelRonström(甲骨文)是非常有用的了解划分是如何在MySQL中实现。

现在HandlerSocket的插件是直接基于通用处理器。在HandlerSocket级别上没有分区知识。当HandlerSocket查询应用于分区表时,将以透明方式使用ha_partition处理程序。

好消息是HandlerSocket的工作对分区表的罚款,无需额外费用。坏消息是它不会从分区修剪中受益,因为它只在SQL查询优化器中实现。

下面是一个例子可以证明这一点(对抗的Percona服务器5.5测试)。 我们将使用2个表:mytable_np未分区,mytable分区。

create table mytable_np (id int, x varchar(100), primary key(id), key(x)) 
engine=InnoDB ; 

insert into mytable_np values (1, 'A'); 
insert into mytable_np values (11, 'B'); 
insert into mytable_np values (21, 'C'); 
insert into mytable_np values (31, 'D'); 
insert into mytable_np values (41, 'E'); 
insert into mytable_np values (51, 'F'); 
commit; 

create table mytable (id int, x varchar(100), primary key(id), key(x)) 
engine=InnoDB 
partition by range (id) (
    partition p0 values less than (10), 
    partition p1 values less than (20), 
    partition p2 values less than (30), 
    partition p3 values less than (40), 
    partition p4 values less than (50), 
    partition pend values less than (1000) 
); 

insert into mytable values (1, 'A'); 
insert into mytable values (11, 'B'); 
insert into mytable values (21, 'C'); 
insert into mytable values (31, 'D'); 
insert into mytable values (41, 'E'); 
insert into mytable values (51, 'F'); 
commit; 

以下查询可以做执行一个简单的主键访问:

select * from mytable where id = 51 ; 

select * from mytable_np where id = 51 ; 

以下的netcat /远程登录脚本可以用于使用HandlerSocket的查询(提防到TAB字符):

P  0  test mytable PRIMARY id,x                                                 
0  =  1  51 

P  0  test mytable_np PRIMARY id,x                                                 
0  =  1  51 

评价查找的数量,下面的查询可以做之前和每个查询执行后计算处理程序键访问次数:

show global status like 'Handler_read_key' ; 

如果我们衡量处理器的关键访问次数在四种情况做了,我们得到:

SQL query against non partitioned table:  2 
SQL query against partitioned table:   2 
HandlerSocket against non partitioned table: 2 
HandlerSocket against partitioned table:  7 

在三个第一的情况下,我们有一个查找找到该行,加上一个额外的关键访问权限检查这是读取的最后一行。在最后一种情况下,我们有一个每个非空分区的查找。其中有6个。只有其中一个键可以找到密钥,并且可以进行额外的访问以检查是否只有一个匹配的行。所以结果是7.

这个例子证明,即使在最简单的情况下(主键访问),HandlerSocket也不能修剪分区。当HandlerSocket用于分区时,应始终预期性能损失。分区越多,开销越高(线性)。

+0

非常感谢你,这是一个非常有趣的阅读 – sathia

+0

非常透彻的答案,值得五颗星。 –