2013-03-15 32 views
0

我想在保留表结构的同时在MySQL中对表进行分区。根据列值对MySQL表进行分区。

我有一个专栏,'Year',根据这个专栏,我想分别将表格分成不同的表格。新表格将包含名称,如'table_2012''table_2013'等。生成的表格需要完全按照源表中的所有字段。

我已经试过SQL脚本中的两件,但没有成功:

1.

CREATE TABLE all_data_table 
( column1 int default NULL, 
    column2 varchar(30) default NULL, 
    column3 date default NULL 
) ENGINE=InnoDB 
PARTITION BY RANGE ((year)) 
(
    PARTITION p0 VALUES LESS THAN (2010), 
    PARTITION p1 VALUES LESS THAN (2011) , PARTITION p2 VALUES LESS THAN (2012) , 
    PARTITION p3 VALUES LESS THAN (2013), PARTITION p4 VALUES LESS THAN MAXVALUE 
); 

2.

ALTER TABLE all_data_table PARTITION BY RANGE COLUMNS (`year`) (
    PARTITION p0 VALUES LESS THAN (2011), 
    PARTITION p1 VALUES LESS THAN (2012), 
    PARTITION p2 VALUES LESS THAN (2013), 
    PARTITION p3 VALUES LESS THAN (MAXVALUE) 
); 

任何援助将不胜感激!

回答

1

从我看到你想从一张大桌子上创建许多桌子。

我认为你应该尝试创建视图。 由于从我关于分区的角度来看,它实际上是对该表的物理存储进行分区,然后将它们分开存储。但是如果你从顶部的角度来看,你会看到他们作为一张桌子。

0

这是旧的,但看到它在分区搜索中出现高度排名,我想我会给可能打到这个页面的人提供一些额外的细节。您在讨论table_2012table_2013不是“MySQL分区”,而是“手动分区”。

分区意味着您有一个具有单个表名称的“逻辑表”,后者在后台分为多个文件。如果你有几百万到几十亿的行,但通常你只搜索一个月,按年份/月划分可以有很好的性能优势,因为MySQL只需要搜索包含你的年份/月份的文件正在搜索......只要您将分区键包含在您的WHERE中。

当您创建多个表,如table_2012table_2013时,您手动对表进行分区,而不使用MySQL PARTITION配置进行分区。要在2012年手动分区表,请将所有数据放入2012表中。当您点击2013年时,您将开始将所有数据放入2013年表格。你必须确保在2013年之前创建表格,否则它将无处可去。然后,当您在多年的时间查询时(例如2012年11月至2013年1月),您必须在table_2012和table_2013之间进行联合查询。

SELECT * FROM table_2012 WHERE #... 
UNION 
SELECT * FROM table_2013 WHERE #... 

通过分区,此手动工作不是必需的。你做分区的初始设置,然后你把它当作一个表。不需要工会,在插入之前不检查日期等。这使生活变得更容易。 MySQL处理搞清楚它需要查询哪些表。但是,您必须确保查询年份列,否则将不得不扫描所有文件。例如。 SELECT * FROM all_data_table WHERE Month=12将扫描Month = 12的所有分区。为确保您只扫描需要扫描的分区文件,您需要确保在每个查询中都包含分区列。

可能对分区产生负面影响......如果你有数十亿行,并且你在表上做了一个ALTER TABLE来说 - 添加一列......它将不得不每隔一行更新一个很长的时间。在我目前为之工作的公司,老板不认为值得花费时间来更新历史上的十亿行,因为我们正在为未来添加一个新列......所以这是我们进行手动分区的原因之一而不是让MySQL去做。

免责声明:我不是分区专家...所以如果我在这方面有任何问题,请告诉我,我会修复不正确的部分。

相关问题