2011-04-03 77 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