2011-12-12 64 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

非常透徹的答案,值得五顆星。 –