0

我對MySQL中的分區和連接表有疑問。 我有這個示例模式:Mysql:連接表中的性能分區

CREATE TABLE A (
`ID` BIGINT NOT NULL AUTO_INCREMENT, 
`NAME` varchar(50) DEFAULT NULL, 
PRIMARY KEY (`ID`), 
KEY `IDX_A_NAME` (`NAME`), 
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 

CREATE TABLE B (
`ID` BIGINT NOT NULL AUTO_INCREMENT, 
`VALUE` double(22,6) DEFAULT NULL, 
`A_REF` BIGINT DEFAULT NULL, 
PRIMARY KEY (`ID`), 
KEY `IDX_A_REF` (`A_REF`), 
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 
PARTITION BY RANGE(A_REF) (
       PARTITION p1000 VALUES LESS THAN (1000), 
    PARTITION p2000 VALUES LESS THAN (2000), 
    PARTITION p3000 VALUES LESS THAN (3000), 
    PARTITION future VALUES LESS THAN MAXVALUE 
          ); 

在B分區表的增長每月約3米榮行。 通過A_REF場分區標準是原因是b表正在用類似下面的查詢訪問(現在,這是不能改變的):

SELECT B.VALUE 
FROM A 
INNER JOIN B ON A.ID = B.A_REF 
WHERE A.NAME = 'James' 

所以,我的問題是

  • 當執行EXPLAIN PARTITIONS ...使用此查詢,所有分區都在EXPLAIN輸出中進行訪問。這是否意味着在執行過程中所有分區都是實際上是?或者它只是分區信息?
  • 它有助於分區標準是JOIN字段嗎?
  • 分區幫助在我的例子中?
  • 是否有任何其他方法(另一個分區標準等)有助於訪問較少的行數或查詢執行速度更快?

我很擔心執行這個查詢一年4000萬行的查詢。所以,任何幫助都非常感激。

回答

1

加快查詢,擺脫分區。

修剪失敗(我認爲),因爲它沒有一個常數來選擇分區。相反,JOIN到達所有分區。除了一個都沒有返回任何內容,其中有A_REF的那個返回行,就好像它是一個非分區表。

有很多情況下分區沒有幫助性能;你似乎找到了一個傷害的地方。

+0

感謝您的解釋。我不能將你的答案標記爲最終答案,但它是有幫助的,對我來說這一切都很重要。那謝謝啦。 – 2015-06-16 06:00:11