在MySQL中维护一个包含唯一值的大表

时间:2010-11-11 08:21:37

标签: mysql large-data

这可能是一种常见情况,但我无法在SO或Google上找到具体答案。

我在MySQL数据库上有一个大表(大约1000万行)的朋友关系非常重要,需要维护,以便没有重复的行。该表存储用户的uid。该表的SQL是:

CREATE TABLE possiblefriends(
 id INT NOT NULL AUTO_INCREMENT, 
 PRIMARY KEY(id),
 user INT, 
 possiblefriend INT)

表的工作方式是每个用户有大约1000个“可能的朋友”被发现并需要存储,但需要避免重复的“可能的朋友”。

问题是,由于程序的设计,在一天的过程中,我需要向表中添加100万行或更多行,这些行可能是或不是重复的行条目。简单的答案似乎是检查每一行以查看它是否重复,如果没有,则将其插入表中。但是随着表格大小增加到1亿行,10亿行或更高(我预计很快就会出现),这种技术可能会变得非常慢。

维护此独特表格的最佳(即最快)方法是什么?

我不需要总是只有一个只有唯一值的表。我只需要每天一次的批处理作业。在这种情况下,我应该创建一个单独的表,只插入所有可能的行(包含重复的行和所有行),然后在一天结束时,创建第二个表来计算第一个表中的所有唯一行吗? / p>

如果没有,这个表长期的最佳方式是什么?

(如果索引是最好的长期解决方案,请告诉我使用哪些索引)

2 个答案:

答案 0 :(得分:7)

(user, possiblefriend)上添加唯一索引,然后使用以下其中一项:

确保在尝试插入重复行时不会出现错误。

您可能还想考虑是否可以删除自动递增主键并使用(user, possiblefriend)作为主键。这将减少表的大小,主键也将作为索引,从而使您不必创建额外的索引。

另见:

答案 1 :(得分:2)

一个独特的索引可以让你确定该字段确实是唯一的,你可以像这样添加一个唯一的索引:

CREATE TABLE possiblefriends( 
 id INT NOT NULL AUTO_INCREMENT,  
 PRIMARY KEY(id), 
 user INT,  
 possiblefriend INT,
PRIMARY KEY (id),
UNIQUE INDEX DefUserID_UNIQUE (user ASC, possiblefriend ASC))

这也会显着提升你的桌面访问权。

质量插入的另一个问题有点棘手,您可以使用下面内置的ON DUPLICATE KEY UPDATE函数:

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1;

UPDATE table SET c=c+1 WHERE a=1;