【问题标题】:MySQL commenting out alter table partition statementMySQL注释掉alter table partition语句
【发布时间】:2018-10-09 18:53:49
【问题描述】:

我现在有一个空表,但将加载数亿条记录。在执行此加载之前,我想在表上创建一些分区以提高查询性能并在以后启用更好的删除(只需截断整个分区)。

我正在使用的更改表代码是:

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 中运行代码时,它运行良好,没有任何错误。当我检查表时,分区未显示在列表中:

在自动生成的 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) */

我不知道为什么会这样。我加载了一些虚假记录,以查看是否缺少数据导致了问题。我还尝试注释掉分区并创建了一个新表,但没有成功。

【问题讨论】:

    标签: mysql partitioning


    【解决方案1】:

    /*!50100 ... */ 是一种特殊类型的评论。它说“如果版本是 5.1.0 或更高版本,则将文本包含为真实;否则将其保留为评论。

    因此,如果您在 5.0 服务器上运行它,它就没有分区。 (5.0 没有实现PARTITIONs。)但是 5.1 和更高版本会。

    您将在mysqldump 输出中看到这方面的变化。

    同时,您可能会发现使用PARTITIONing 并没有获得任何性能。你希望什么?

    【讨论】:

    • 诚然,该表尚未完全加载,但我确实认为我已经看到了一些性能改进。 1. 我正在使用 python 脚本来加载表格。用户可以通过一年,脚本将截断该分区,然后将数据重新加载到该分区。以前,一年的删除需要永远。 2. 所有查询都会有一个日期或日期范围,解释计划显示 SQL 引擎只从必要的分区读取。我不是 DBA,但我认为这意味着它不会扫描其他不必要的行。如果我遗漏了什么,请随时发表评论。
    • 您是否一次插入一个INSERT?有一些方法可以显着加快速度。 (批量插入、LOAD DATA、事务等)。您当前的问题仅询问“评论”。如果您需要讨论性能,请提出一个新问题。
    • 我确实在对数据库进行批量插入。 Python 性能很好,我认为数据库性能现在很好(一旦完全加载就会知道更多)。我会知道更多,如果需要的话,我会在以后提出一个不同的问题。你是对的,我最初的问题只是分区没有出现在某些屏幕上并理解评论。
    【解决方案2】:

    经过更多研究,我将在单击表检查器时将分区未显示在分区屏幕中的事实归结为 GUI 中的错误。当您选择 Alter Table 并查看分区选项卡时,它们会显示在那里。此外,当检查PARTITIONS 信息表时,分区也会显示在那里。请参阅 Rick James 的回答以了解注释语法。

    【讨论】:

    • 使用命令行“mysql”工具。在里面做SHOW CREATE TABLE table_name\G 来查看完整的定义。
    猜你喜欢
    • 1970-01-01
    • 2021-12-21
    • 2010-12-04
    • 2013-01-26
    • 1970-01-01
    • 2019-11-27
    • 2012-07-16
    • 2020-05-04
    • 1970-01-01
    相关资源
    最近更新 更多