【问题标题】:MySQL Partitioning a Table That Contains a Primary KeyMySQL对包含主键的表进行分区
【发布时间】:2022-01-22 08:26:28
【问题描述】:

我有一个要分区的表:

CREATE TABLE `tbl_orders` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(50) NOT NULL DEFAULT '0' COLLATE 'utf8mb4_general_ci',
    `system_id` INT(11) NOT NULL DEFAULT '0',
    `created_at` DATETIME NULL DEFAULT NULL,
    `updated_at` DATETIME NULL DEFAULT NULL,
    PRIMARY KEY (`id`) USING BTREE,
    INDEX `system_id` (`system_id`) USING BTREE
)
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=8
;

ALTER table tbl_orders
PARTITION BY HASH(system_id)
PARTITIONS 4;

我想要达到的目标示例: 我有一张表,我想按system_id 对其进行分区以加快查询速度。

运行分区时出现以下错误:

/* SQL 错误 (1503): PRIMARY KEY 必须包含表的分区函数中的所有列 */

  1. 要成功运行此分区,同时仍能实现在 system_id 上拆分表的目标,我需要进行哪些更改?
  2. 使用表上的主键可以实现这种分区方式吗?

【问题讨论】:

  • 请向我们展示您希望加快速度的查询。你已经有一个INDEX;这比PARTITION BY HASH好多了。
  • 我的问题的重点是找出解决问题的方法。请问有人可以帮忙解决这个问题吗?

标签: mysql partitioning


【解决方案1】:

PARTITIONing 要求您将“分区键”(system_id) 添加到每个唯一索引,包括 PRIMARY KEY

我预测,您会发现PARTITION BY HASH 对性能毫无用处。它甚至可能会减慢查询速度。

请显示您希望加快速度的查询;我会提供更详细的建议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多