gpt4 book ai didi

mysql - 使用主键和连接的唯一索引对 MySQL 表进行分区

转载 作者:搜寻专家 更新时间:2023-10-30 19:53:51 25 4
gpt4 key购买 nike

我有一张表存储大约 40,000 家企业的每周观看统计数据,该表传递了 220 万条记录并开始放慢速度,我正在考虑对其进行分区以加快速度,但我不确定如何最好做吧。

我的 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 and week = xx and year = xx”搜索当前周/业务的记录时,它会知道要使用哪个分区而无需搜索所有分区?但是,当我得到结果并通过 ORM 保存它时,它将使用 id 字段并且不知道使用哪个分区?

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

我的做法是否正确,或者是否有更好的方法来对这样的表进行分区?

感谢您的帮助!

最佳答案

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

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

关于mysql - 使用主键和连接的唯一索引对 MySQL 表进行分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11214737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com