使用主键和concatonated唯一索引对MySQL表进行分区

时间:2012-06-26 19:35:52

标签: mysql database partitioning

我有一个存储大约40,000个企业的每周观看统计数据的表,这些表通过了2.2M记录并且开始减慢速度,我正在考虑将其分区以加快速度,但我不确定如何最好做到这一点。

我的ORM需要一个id字段作为主键,但该字段与数据无关,我一直在字段中使用年份,周数和业务ID的唯一索引。

由于我需要主键参与分区映射,我不确定如何最好地组织它(我之前从未使用过分区)。

目前我有......

    CREATE TABLE `weekly_views` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `business_id` int(11) NOT NULL,
    `year` smallint(4) UNSIGNED NOT NULL,
    `week` tinyint(2) UNSIGNED NOT NULL,
    `hits` int(5) NOT NULL,
    `created` timestamp NOT NULL ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `updated` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
    UNIQUE `search` USING BTREE (business_id, `year`, `week`),
    UNIQUE `id` USING BTREE (id, `week`)
) ENGINE=`InnoDB` AUTO_INCREMENT=2287009 DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ROW_FORMAT=COMPACT CHECKSUM=0 DELAY_KEY_WRITE=0 PARTITION BY LIST(week) PARTITIONS 52 (PARTITION p1 VALUES IN (1) ENGINE = InnoDB,
 PARTITION p2 VALUES IN (2) ENGINE = InnoDB,
 PARTITION p3 VALUES IN (3) ENGINE = InnoDB,
 PARTITION p4 VALUES IN (4) ENGINE = InnoDB,
(5 ... 51)
 PARTITION p52 VALUES IN (52) ENGINE = InnoDB);

每周一个分区似乎是打破它们的唯一合理方式。我是正确的当我使用'business_id = xx和week = xx和year = xx'搜索当前周/业务的记录时,它将知道使用哪个分区而不搜索所有分区?但是,当我得到结果并通过ORM保存它时,它将使用id字段而不知道要使用哪个分区?

我想我可以使用自定义查询来插入或更新(我原来没有这样做,因为ORM不支持它)。

我是否正确地对此进行了解决,还是有更好的方法来对这样的表进行分区?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

只要查询在week子句中有WHERE列,MySQL就会查找正确的分区。但是,每年重复几周,您将在同一分区中获得不同年份的数据。

此外,您需要53个分区,因为您需要处理闰年。