0

我想在 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)
);

任何援助将不胜感激!

4

2 回答 2

2

这是旧的,但看到它在分区搜索中排名很高,我想我会为可能点击此页面的人提供一些额外的细节。您所说的table_2012不是table_2013“MySQL 分区”而是“手动分区”。

分区意味着您拥有一个具有单个表名的“逻辑表”,该表在幕后被划分为多个文件。当你有数百万到数十亿行,多年来,但通常你只搜索一个月,按年/月分区可以有很大的性能优势,因为 MySQL 只需要搜索包含你的年/月的文件正在搜索...只要您在 WHERE 中包含分区键。

当您创建多个表时table_2012table_2013您将手动对表进行分区,而 MySQL PARTITION 配置不会这样做。要手动对表进行分区,请在 2012 年期间将所有数据放入 2012 表中。当您到达 2013 年时,您开始将所有数据放入 2013 表中。您必须确保在 2013 年之前创建表格,否则它将无处可去。然后,当您跨年查询时(例如,从 2012 年 11 月到 2013 年 1 月),您必须在 table_2012 和 table_2013 之间进行 UNION。

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

有了分区,这个手工工作就没有必要了。您进行分区的初始设置,然后将其视为单个表。不需要工会,在插入之前不需要检查日期等。这让生活变得更加轻松。MySQL 负责确定它需要查询哪些表。但是,您必须确保查询 Year 列,否则它必须扫描所有文件。例如SELECT * FROM all_data_table WHERE Month=12,将扫描 Month=12 的所有分区。为确保您只扫描需要扫描的分区文件,您需要确保在每个查询中都包含分区列。

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

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

于 2015-09-02T23:15:48.933 回答
1

据我所知,您想从一张大表中创建许多表。

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

于 2013-03-15T06:31:42.363 回答