如题.
有一张表u_user ,表本来有几千万数据。
现在针对表添加分区:
alter table u_user
    PARTITION BY hash(id)
    PARTITIONS 5;

出现错误提示:
[SQL]alter table u_user
    PARTITION BY hash(id)
    PARTITIONS 5;
[Err] 1503 - A UNIQUE INDEX must include all columns in the table's partitioning function。id为表的主键。下面为表的建表语句。
CREATE TABLE `NewTable` (
`id`  bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键' ,
`source`  int(11) NOT NULL COMMENT '订单来源,0表示ecm,以后可能有其它的系统,例如直销o2o。订单相关的键值,例如orderId, 必须和source合起来才唯一' ,
`order_item_id`  bigint(20) NOT NULL COMMENT '对应ecm的 orderItemId, orderItemId+source唯一' ,
`order_id`  bigint(20) NOT NULL COMMENT '对应ecm的 orderId,非唯一' ,
`platform_id`  int(11) NULL DEFAULT NULL COMMENT '平台编码' ,
`receiver_name`  varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '收货人姓名' ,
`receiver_mobile`  varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '收货人手机号,根据 receiverMobile+brand, 可得到 uid' ,
`receiver_user_id`  bigint(20) NULL DEFAULT NULL COMMENT '收货人 userId。如果没有品牌,则该值为 null' ,
`brand`  int(11) NULL DEFAULT NULL COMMENT '商品的品牌,品牌根据 itemId 得出,一般情况下都不为 null' ,
`item_id`  varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '商品编码' ,
`item_name`  varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '商品名称' ,
`product_model`  varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '产品型号' ,
`product_type_id`  varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '产品类型id' ,
`product_type`  varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '产品类型。例如波轮,滚筒' ,
`crm_entcode`  varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '事业部编码。当前有编码,但无对应的名称' ,
`item_cnt`  int(11) NOT NULL COMMENT '数量' ,
`item_price`  decimal(13,2) NOT NULL COMMENT '单价' ,
`item_amount`  decimal(13,2) NOT NULL COMMENT '金额 item_amount=item_cnt*item_price' ,
`delivery_fee`  decimal(13,2) NOT NULL COMMENT '运费' ,
`discount_amount`  decimal(13,2) NOT NULL COMMENT '优惠金额' ,
`adjust_amount`  decimal(13,2) NOT NULL COMMENT '调整金额' ,
`payment_amount`  decimal(13,2) NOT NULL COMMENT '应付金额 payment_amount=item_amount+delivery_fee-discount_amount+adjust_amount' ,
`refund_cnt`  int(11) NOT NULL COMMENT '退货数量,需要根据退货单计算得出' ,
`actual_cnt`  int(11) NOT NULL COMMENT '实际剩余的数量,即 actualCnt=itemCnt-refundCnt; 剩余数量为0的不会出现在我的产品' ,
`refund_amount`  decimal(13,2) NOT NULL COMMENT '退货金额' ,
`actual_pay_amount`  decimal(13,2) NOT NULL COMMENT '实际支付金额 actualPayAmount=paymentAmount-refundAmount' ,
`status`  int(11) NULL DEFAULT NULL COMMENT '复制过来的 status。这个字段只是保留,不用于状态计算。订单只关心是否cancel' ,
`cancel`  bit(1) NOT NULL COMMENT 'true表示已取消。这个值根据 status 得出。ccrm只关心订单是否取消' ,
`exchange`  bit(1) NOT NULL COMMENT 'true表示是换货单,NOTE 换货单会出现在我的订单,但不会出现在我的产品,不计算退货数量和金额(因为最终没变),也不参与客单价计算。NOTE 问题:如果换货后的收货人和原收货人不是同一个人,则新的收货人看不到该产品' ,
`invoice_code`  varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '发票号' ,
`logistics_com_code`  varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '物流公司编码' ,
`logistics_no`  varchar(2200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '物流单号' ,
`user_hide_time`  datetime NULL DEFAULT NULL COMMENT '用户隐藏时间,为 null 表示不隐藏,否则隐藏,即用户认为不是自己的数据' ,
`order_create_time`  datetime NULL DEFAULT NULL COMMENT '对应 outerCreateTime,用户在第3方平台下单的时间,即购买时间' ,
`cancel_time`  datetime NULL DEFAULT NULL COMMENT '取消时间' ,
`data_update_time`  datetime NOT NULL COMMENT '数据更新时间' ,
`create_time`  datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ,
`update_time`  datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ,
PRIMARY KEY (`id`),
UNIQUE INDEX `order_item_id_source` (`order_item_id`, `source`) USING BTREE ,
INDEX `order_id` (`order_id`) USING BTREE ,
INDEX `receiver_user_id` (`receiver_user_id`) USING BTREE ,
INDEX `receiver_mobile_brand` (`receiver_mobile`, `brand`) USING BTREE 
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
COMMENT='订单明细表'
AUTO_INCREMENT=26621196
ROW_FORMAT=COMPACT
;

解决方案 »

  1.   

    PRIMARY KEY (`id`),
    UNIQUE INDEX `order_item_id_source` (`order_item_id`, `source`)这些值必须都加入到分区字段中。
      

  2.   


    请问如果是string 类型的UNIQUE INDEX 可以进行hash分区吗?hash要求整数,如何进行处理呢?cast的函数又不可以用。
      

  3.   

    情况是这样的,我的表里面的有几个唯一索引和一个主键,唯一索引是字符串来的字段,如果要进行分区的话,我想了一个方法是把字符转数值,然后加起来进行hash分区。但是使用HEX和cast的时候显示This partition function is not allowed。对于这种情况有什么好的处理方案建议吗?