3

抱歉,如果这是一个愚蠢的问题,但对此很陌生,所以需要一些帮助来理解一些事情。我目前将 mysql 升级到 5.1,所以我可以在 mysql 中使用分区。我的问题是,如果我对表进行分区,分区表(包括修剪过程)是否仍然可以使用连接进行查询,或者如果您只是查询具有分区的表,则分区是否最佳?

编辑

这是一个示例查询:

SELECT event.*,site.* FROM event INNER JOIN site ON event.siteid = site.id
WHERE event.eventdate >= [somedate] AND event.eventdate <= [somedate]
AND event.siteid = [siteid]

我使用 eventdate 字段在事件表上设置了分区。mysql 是否仍然能够使用事件表上的分区,包括修剪过程?

4

2 回答 2

3

分区表可用于连接。

调整where子句以仅包含一个分区以获得最佳性能。
例如,如果您按年份分区,您可以进行如下连接:

select * from a
inner join partioned_table p on (p.id = a.id)
where p.year = '2011';

此查询将在有或没有 where 子句的情况下工作,但使用 where 子句会更快,因为您只访问一个分区。
如果您访问更多分区,MySQL 必须使用临时表将分区拼接在一起,然后才能进行连接。
这种破坏分区的目的。

于 2011-06-22T17:12:17.870 回答
0

不确定我是否理解这个问题,但分区不应影响您的连接工作方式。它只会影响数据的存储方式。MySQL 引擎将负责知道从哪里获取数据,因此实际上您应该保持连接的方式与您的连接方式相同。这是一个例子:

CREATE TABLE members (
    firstname VARCHAR(25) NOT NULL,
    lastname VARCHAR(25) NOT NULL,
    username VARCHAR(16) NOT NULL,
    email VARCHAR(35),
    joined DATE NOT NULL
)
PARTITION BY RANGE( YEAR(joined) ) (
    PARTITION p0 VALUES LESS THAN (1960),
    PARTITION p1 VALUES LESS THAN (1970),
    PARTITION p2 VALUES LESS THAN (1980),
    PARTITION p3 VALUES LESS THAN (1990),
    PARTITION p4 VALUES LESS THAN MAXVALUE
);

select a.* 
from members a, subscriptions b 
where a.email = b.email and b.generation='X' 
  and a.joined between '1980-01-01' and now()

让我知道这是否有意义!马塞洛

于 2011-06-22T17:26:43.843 回答