Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.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_Subquery_Partitioning - Fatal编程技术网

Mysql 分区和子选择

Mysql 分区和子选择,mysql,subquery,partitioning,Mysql,Subquery,Partitioning,我在分区和子查询(mysql 5.1)方面有问题。当我使用subselect执行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

我在分区和子查询(mysql 5.1)方面有问题。当我使用subselect执行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
显示上面的select使用所有20个分区,即使这个子select只返回一个值。是不是因为mysql在优化查询时不知道subselect的结果集

在给定的示例中,我应该如何获得分区



编辑:我发现了一个bug,正是考虑到这个问题()。它在2008年被修复,但在mysql 6.0中被修复:(我读到很多附魔从mysql 6.0迁移到mysql 5.5。目前我正试图确认5.5版中包含了这个特定的修复程序。

如果子查询只返回一行,您可以使用常规联接。查询将从
其他\u表
驱动到
分开的\u表

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

不幸的是,它几乎不会只有一行。在给定的示例中,
parted_table
有1M行,
other_table
(也已分区)有2000万行。我决定在两个单独的选择上拆分查询。最终,有了这两个选择,它仍然会非常快(或者说足够快)。