MySQL 注释掉 alter table 分区语句
MySQL commenting out alter table partition statement
我有一个 table 目前是空的,但将加载数亿条记录。在执行此加载之前,我想在 table 上创建一些分区以提高查询性能并在以后启用更好的删除(只需 t运行 整个分区)。
我使用的改变 table 代码是:
ALTER TABLE `TABLE_NAME`
PARTITION BY RANGE (YEAR(DATE_FIELD)) (
PARTITION y1 VALUES LESS THAN (2017),
PARTITION y2 VALUES LESS THAN (2018),
PARTITION y3 VALUES LESS THAN (2019),
PARTITION ymax VALUES LESS THAN (2050)
);
当我 运行 MySQL Workbench 中的代码时,它执行得很好,没有任何错误。当我检查 table 时,分区没有出现在列表中:
并且在自动生成的 DDL 中,分区被注释掉:
CREATE TABLE `TABLE_NAME` (
`field1` decimal(5,2) DEFAULT NULL,
`field2` decimal(5,2) DEFAULT NULL,
`DATE_FIELD` date NOT NULL,
`field3` float DEFAULT NULL,
`field4` float DEFAULT NULL,
`field5` datetime DEFAULT NULL,
`field6` varchar(50) NOT NULL,
PRIMARY KEY (`field6`,`DATE_FIELD`),
KEY `dd_IDX1` (`DATE_FIELD`,`field1`,`field2`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
/*!50100 PARTITION BY RANGE (year(`DATE_FIELD`))
(PARTITION y1 VALUES LESS THAN (2017) ENGINE = InnoDB,
PARTITION y2 VALUES LESS THAN (2018) ENGINE = InnoDB,
PARTITION y3 VALUES LESS THAN (2019) ENGINE = InnoDB,
PARTITION ymax VALUES LESS THAN (2050) ENGINE = InnoDB) */
我不明白为什么会这样。我加载了一些虚假记录,看看是不是缺少数据导致了这个问题。我还尝试注释掉分区并创建一个新的 table 但没有运气。
经过更多研究,我打算将单击 Table 检查器时分区未显示在分区屏幕中这一事实归因于 GUI 中的错误。当您 select 更改 Table 并查看分区选项卡时,它们会出现在那里。此外,在检查 PARTITIONS
信息时 table 分区也会显示在那里。请参阅 Rick James 的回答以了解评论语法。
/*!50100 ... */
是一种特殊的注释类型。它说“如果版本是 5.1.0 或更高版本,请将文本作为真实内容包含在内;否则将其作为评论保留。
因此,如果您 运行 在 5.0 服务器上使用它,它不会有分区。 (5.0 没有 PARTITIONs
实现。)但是 5.1 和更高版本将会。
您将在 mysqldump
输出中看到此变化。
与此同时,您可能会发现使用 PARTITIONing
没有任何性能提升。你希望得到什么?
我有一个 table 目前是空的,但将加载数亿条记录。在执行此加载之前,我想在 table 上创建一些分区以提高查询性能并在以后启用更好的删除(只需 t运行 整个分区)。
我使用的改变 table 代码是:
ALTER TABLE `TABLE_NAME`
PARTITION BY RANGE (YEAR(DATE_FIELD)) (
PARTITION y1 VALUES LESS THAN (2017),
PARTITION y2 VALUES LESS THAN (2018),
PARTITION y3 VALUES LESS THAN (2019),
PARTITION ymax VALUES LESS THAN (2050)
);
当我 运行 MySQL Workbench 中的代码时,它执行得很好,没有任何错误。当我检查 table 时,分区没有出现在列表中:
并且在自动生成的 DDL 中,分区被注释掉:
CREATE TABLE `TABLE_NAME` (
`field1` decimal(5,2) DEFAULT NULL,
`field2` decimal(5,2) DEFAULT NULL,
`DATE_FIELD` date NOT NULL,
`field3` float DEFAULT NULL,
`field4` float DEFAULT NULL,
`field5` datetime DEFAULT NULL,
`field6` varchar(50) NOT NULL,
PRIMARY KEY (`field6`,`DATE_FIELD`),
KEY `dd_IDX1` (`DATE_FIELD`,`field1`,`field2`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
/*!50100 PARTITION BY RANGE (year(`DATE_FIELD`))
(PARTITION y1 VALUES LESS THAN (2017) ENGINE = InnoDB,
PARTITION y2 VALUES LESS THAN (2018) ENGINE = InnoDB,
PARTITION y3 VALUES LESS THAN (2019) ENGINE = InnoDB,
PARTITION ymax VALUES LESS THAN (2050) ENGINE = InnoDB) */
我不明白为什么会这样。我加载了一些虚假记录,看看是不是缺少数据导致了这个问题。我还尝试注释掉分区并创建一个新的 table 但没有运气。
经过更多研究,我打算将单击 Table 检查器时分区未显示在分区屏幕中这一事实归因于 GUI 中的错误。当您 select 更改 Table 并查看分区选项卡时,它们会出现在那里。此外,在检查 PARTITIONS
信息时 table 分区也会显示在那里。请参阅 Rick James 的回答以了解评论语法。
/*!50100 ... */
是一种特殊的注释类型。它说“如果版本是 5.1.0 或更高版本,请将文本作为真实内容包含在内;否则将其作为评论保留。
因此,如果您 运行 在 5.0 服务器上使用它,它不会有分区。 (5.0 没有 PARTITIONs
实现。)但是 5.1 和更高版本将会。
您将在 mysqldump
输出中看到此变化。
与此同时,您可能会发现使用 PARTITIONing
没有任何性能提升。你希望得到什么?