Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql分区和连接_Mysql_Database Partitioning - Fatal编程技术网

Mysql分区和连接

Mysql分区和连接,mysql,database-partitioning,Mysql,Database Partitioning,对不起,如果这是一个愚蠢的问题,但新的,所以需要一些帮助,以了解一些事情。我目前正在将mysql升级到5.1,这样我就可以在mysql中使用分区了。我的问题是,如果我对一个表进行分区,那么一个分区的表(包括修剪过程)是否仍然可以使用连接进行查询,或者如果您只是查询具有分区的表,分区是否是最优的 编辑 以下是一个查询示例: SELECT event.*,site.* FROM event INNER JOIN site ON event.siteid = site.id WHERE event.e

对不起,如果这是一个愚蠢的问题,但新的,所以需要一些帮助,以了解一些事情。我目前正在将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]
从event.siteid=site.id上的事件内部加入站点中选择event.*、site.*

其中event.eventdate>=[somedate]和event.eventdate分区表可用于联接

调整
where
子句,只包含一个分区,以获得最佳性能。
e、 g.如果您按年份划分,您可以执行如下连接:

select * from a
inner join partioned_table p on (p.id = a.id)
where p.year = '2011';
此查询可以使用where子句,也可以不使用where子句,但使用where子句会更快,因为您只访问一个分区。
如果访问更多分区,MySQL必须使用临时表将分区缝合在一起,然后才能进行连接。

这种方法违背了分区的目的

我不太清楚这个问题,但是分区不应该影响连接的工作方式。它只会影响数据的存储方式。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()
让我知道这是否有意义!
Marcelo

你说的包含一个分区是什么意思?你提到过一个例子吗?如果查询的日期属于多个分区,该怎么办?我用一个示例查询更新了我的原始帖子,所以我想我应该按年份划分表,因为如果我按月份划分表,则会增加扫描多个分区的机会。对吗?@John,正是如果你想要性能,你应该划分分区,这样你几乎永远不会从多个分区进行查询。如果不混合月份,则按月份划分当然可以,这要视情况而定。他们可能会搜索两个不同月份之间的开始和结束日期,例如,到目前为止的最后30天跨越了5月和6月。唯一的问题是1年内可能有100万行,所以他们搜索的不是300万行,而是100万行。还有很多行要搜索。这就是为什么我认为最好按月/年而不是按年进行搜索2个分区比12个分区好,我建议您进行实验。使用1个分区总是最好的,但是我想使用100000+100000行的2个分区比使用一百万行的1个分区要快。这是有道理的。我的问题是分区如何处理索引?在查询中,您可以通过电子邮件加入表,但在create语句中,您没有任何索引。那么,这对优化是如何起作用的呢?在分区表上不能有任何索引吗?@John,是的,可以,没有问题!mysql论坛上有你的问题的线索。让我把它放在[(这里),根据线程,“如果您有一个表是按月分区的,并且在该表上创建了一个索引,那么它实际上也会按月分区。”因此,如果我在您的members表中有电子邮件索引,则不会导致分区出现任何问题?如果我在events表中有一个主自动递增键,又会怎样?这会影响分区吗?