我有一个带有范围分区的MySQL表。在PostgreSQL中,我可以选择tableoid
列来查看每行所在的分区(因为使用PostgreSQL我必须明确使用表继承来实现分区)。在MySQL中有类似的方法吗?这大致是我想要的(让我们假设我使用范围分区按年分区orders
表):
SELECT orders.cost_usd, orders.partition_name
FROM orders
WHERE orders.year > 2005;
结果将是:
+-----------------+-----------------------+
| orders.cost_usd | orders.partition_name |
+-----------------+-----------------------+
| 1039.90 | p_2005 |
| 459.06 | p_2006 |
| 033.77 | p_2006 |
| 6473.36 | p_2008 |
| 240.17 | p_2009 |
| 1011.20 | p_2013 |
+-----------------+-----------------------+
答案 0 :(得分:0)
为了解决这个问题,您可以使用INFORMATION_SCHEMA.PARTITIONS
表。
对您特别有用的将是PARTITION_DESCRIPTION
和PARTITION_NAME
字段。
来自:http://dev.mysql.com/doc/refman/5.1/en/partitions-table.html
PARTITION_DESCRIPTION:此列用于RANGE和LIST 分区。对于RANGE分区,它包含在中设置的值 分区的VALUES LESS THAN子句,可以是整数或 MAXVALUE。对于LIST分区,此列包含值 在分区的VALUES IN子句中定义,这是一个 以逗号分隔的整数值列表。
对于PARTITION_METHOD不是RANGE或LIST的分区, 此列始终为NULL。
最后,非常重要 - 确切的SQL解决方案还取决于所使用的PARTITION的类型。请参阅{{3} }。
create table orders
(cost_usd double,
year int
)
PARTITION BY RANGE(year)
(
PARTITION p_2005 VALUES LESS THAN (2006),
PARTITION p_2006 VALUES LESS THAN (2007),
PARTITION p_2007 VALUES LESS THAN (2008),
PARTITION p_2008 VALUES LESS THAN (2009),
PARTITION p_2009 VALUES LESS THAN (2010),
PARTITION p_2010 VALUES LESS THAN (2011),
PARTITION p_2011 VALUES LESS THAN (2012),
PARTITION p_2012 VALUES LESS THAN (2013),
PARTITION p_2013 VALUES LESS THAN (2014)
);
insert into orders values (1039.90, 2005);
insert into orders values (459.06, 2006);
insert into orders values (033.77, 2006);
insert into orders values (6473.36, 2008);
insert into orders values (240.17, 2009);
insert into orders values (1011.20, 2013);
<强> SQL:强>
SELECT DISTINCT orders.cost_usd, PartitionInfo2.PARTITION_NAME
FROM orders,
( SELECT orders.year,
min(CONVERT(p.PARTITION_DESCRIPTION,UNSIGNED INTEGER)) AS rangeMax
FROM orders,
INFORMATION_SCHEMA.PARTITIONS p
WHERE orders.year < CONVERT(p.PARTITION_DESCRIPTION,UNSIGNED INTEGER)
AND TABLE_NAME='orders'
GROUP BY orders.year) AS PartitionInfo,
INFORMATION_SCHEMA.PARTITIONS PartitionInfo2
WHERE orders.year = PartitionInfo.year AND
CONVERT(PartitionInfo2.PARTITION_DESCRIPTION,UNSIGNED INTEGER) =
PartitionInfo.RangeMax;
<强>结果:强>
COST_USD PARTITION_NAME
1039.9 p_2005
459.06 p_2006
33.77 p_2006
6473.36 p_2008
240.17 p_2009
1011.2 p_2013
下面是一个通过哈希进行分区的示例,但另外,我们从年整数中减去2000,以使分区索引从零开始。
create table orders
(cost_usd double,
year int
)
PARTITION BY HASH(year-2000) PARTITIONS 20;
基本上,这意味着我们将拥有20个分区,这些分区将适合2000年到2020年的年份。不幸的是,较大的值将介于两者之间。
如上所述的设置可以提供更简单的解决方案。
<强> SQL:强>
select cost_usd, p.PARTITION_NAME, concat('p_',orders.year) PRETTY_PNAME
from INFORMATION_SCHEMA.PARTITIONS p,
orders where
TABLE_NAME='orders' AND
PARTITION_ORDINAL_POSITION+1999 = orders.year;
<强>结果:强>
COST_USD PARTITION_NAME PRETTY_PNAME
1039.9 p5 p_2005
459.06 p6 p_2006
33.77 p6 p_2006
6473.36 p8 p_2008
240.17 p9 p_2009
1011.2 p13 p_2013