【问题标题】:Mysql partitioning on table with Md5 unique key使用 Md5 唯一键对表进行 Mysql 分区
【发布时间】:2012-10-15 21:49:12
【问题描述】:

在几百万行的大表上创建分区时遇到问题。

CREATE TABLE  `searcheg`.`pages` (
  `urlId` int(9) NOT NULL AUTO_INCREMENT,
  `url` varchar(1024) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `urlhash` binary(16) NOT NULL,<< MD5 unhex.
  PRIMARY KEY (`urlId`),
  UNIQUE KEY `urlhash` (`urlhash`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

如何分区? urlhash 必须是唯一的,因为我需要插入大量行并检查重复。由于分区必须包含所有唯一列并且不能是非整数值。分区的一个原因是减少 .ibd 以获得更易于管理的大小,因为它增长超过 50G,我想拆分它们。 urlID 作为主键是为了防止每次插入时行重新排序。 urlhash 是唯一的,以防止重复输入。 我正在寻找一种无需删除主键即可拆分表的方法。

【问题讨论】:

  • 我不会使用 md5 进行分区,因为它是一个非常强大但速度较慢的哈希函数。它用于不同的目的。

标签: mysql unique partitioning


【解决方案1】:

如果您使用的是 MySQL v5.5,那么您可以使用新的 PARTITION BY RANGE COLUMNS 选项。 如果您可以删除多余的urlID 列并将usrhash 定义为主键,那么您的表定义可能如下所示:

CREATE TABLE pages (
  url VARCHAR(1024) NOT NULL,
  urlhash BINARY(16) NOT NULL,
  PRIMARY KEY (urlhash)
)
PARTITION BY RANGE COLUMNS (urlhash) (
  PARTITION p0 VALUES LESS THAN ('j'),
  PARTITION p1 VALUES LESS THAN ('r'),  -- split in as many ranges as you wish
  PARTITION p2 VALUES LESS THAN (MAXVALUE)
) ;

如果需要urlID(例如通过框架),那么我不知道,因为主键或唯一索引“必须包括表分区函数中的所有列”...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多