gpt4 book ai didi

mysql - "Lost"分区后30%的记录

转载 作者:可可西里 更新时间:2023-11-01 09:03:39 25 4
gpt4 key购买 nike

我有一个超过 18GB 数据的 9000 万条记录的 MYISAM 表,测试表明它是分区的候选者。

原始架构:

CREATE TABLE `email_tracker` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`hash` varchar(65) COLLATE utf8_unicode_ci NOT NULL,
`userId` int(11) NOT NULL,
`dateSent` datetime NOT NULL,
`dateViewed` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `userId` (`userId`),
KEY `dateSent` (`dateSent`),
KEY `dateViewed` (`dateViewed`),
KEY `hash` (`hash`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 1 row in set (0.01 sec)

我之前在测试服务器上使用“ALTER TABLE email_tracker PARTITION BY HASH...”对表进行了分区,并对它运行了典型的查询,查询没有出现任何问题。为了避免在生产数据库上锁定表,我使用这种方法在测试服务器上再次测试,因为我们可以承受在运行时丢失一些跟踪数据:

RENAME TABLE email_tracker TO email_tracker_orig; CREATE TABLE email_tracker LIKE email_tracker_orig;
CREATE TABLE email_tracker_part LIKE email_tracker_orig;
ALTER TABLE email_tracker_part DROP PRIMARY KEY, ADD PRIMARY KEY (id, userId);
ALTER TABLE email_tracker_part PARTITION BY HASH (id + userId) partitions 30;
INSERT INTO email_tracker_part (SELECT * FROM email_tracker_orig);

_orig 表有 90,795,103 条记录。查询后,_part表只有68,282,298。我不知道为什么会这样。有什么想法吗?

mysql> select count(*) from email_tracker_orig;
+----------+
| count(*) |
+----------+
| 90795103 |
+----------+
1 row in set (0.00 sec)

mysql> select count(*) from email_tracker_part;
+----------+
| count(*) |
+----------+
| 68274818 |
+----------+
1 row in set (0.00 sec)

(在后续测试中,_part 表包含的记录数量略有不同,这更奇怪)

编辑 #1:刚刚意识到由于复制的自动增量增量 = 2,分区表的一半是空的,所以要按 KEY (userId) 重新分区,看看结果如何。

编辑 #2 - 重新分区后仍然相同,因此尝试识别丢失的行以建立模式。

最佳答案

我不确定你的要求,但是 mysql documentation声明“不特别推荐使用涉及多列的散列表达式”。我建议您只按 id 进行分区。按 id + userId 进行分区不会明显改善元素在分区之间的分布。

关于mysql - "Lost"分区后30%的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35545610/

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