2011-04-03 79 views
0

我有一个分区和子查询(mysql 5.1)的问题。恰恰当我执行select select时,mysql会跳过分区。我不明白为什么。没错,我有一个分区表是这样的:分区和子查询

CREATE TABLE parted_table (
    id INT NOT NULL PRIMARY KEY, 
    name VARCHAR(20) 
) PARTITION BY KEY() PARTITIONS 20; 

查询看起来像:

select * from parted_table where id in (select col_fk from other_table); 

而且explain partitions表明,上述选择使用所有20个分区,即使该子查询只返回一个值。在查询的最优化过程中,mysql是否不知道子查询的结果集?

我该怎么做才能在给定的例子中进行分区?


编辑:我发现了一个bug正是考虑这个问题(http://bugs.mysql.com/bug.php?id=22765)。它在2008年得到了修复,但它在mysql 6.0中被修复了:(我读了很多附魔从mysql 6.0移到了mysql 5.5,此刻我试图确认这个特定的修复包含在ver.5.5中。

回答

0

如果你的子查询只返回一个行,你可以使用常规连接,查询将从other_table被驱动到。

select * 
    from other_table 
    join parted_table on(parted_table.id = other_table.col_fk); 
+0

不幸的是,几乎没有将只是一个一行,在给定的例子'parted_table'有1M行,'other_table'(也是分区的)有20M行,我决定把查询分成两个独立的选择,最后,这两个选择仍然会很快(或者足够快)。 – emstol 2011-04-04 06:49:49