在MySQL中维护唯一值的大型表

在MySQL中维护唯一值的大型表,mysql,large-data,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个“可能的朋友”

这可能是一种常见的情况,但我无法在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亿行或更大时,这种技术可能会变得非常缓慢(我预计很快就会实现)

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

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

如果不是,那么从长远来看,该表的最佳方式是什么


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

(用户,可能的话)
上添加一个唯一的索引,然后使用其中一个:

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

您可能还想考虑是否可以删除自动递增主键,并使用<代码>(用户、可能朋友)< /代码>作为主键。这将减小表的大小,并且主键将用作索引,从而使您不必创建额外的索引

另见:


唯一索引将确保字段确实是唯一的,您可以添加如下唯一索引:

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))
这也将大大提高您的表访问速度

批量插入的另一个问题有点棘手,您可以使用下面内置的复制密钥更新功能:

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;

我读过这个问题。INSERT IGNORE(插入忽略)或INSERT…在重复键更新时对一个通常有1亿行的表有效吗?@eric:我想,
INSERT IGNORE
是最快的,但我只是在猜测。为了确保可以对这三种方法都运行性能测试。我链接到的问题的最热门答案建议使用
INSERT…ON DUPLICATE KEY UPDATE
@symcbean:谢谢你指出这一点。不知怎的,我忘了提到这个非常重要的细节!谢谢使用索引是否总是更好?使用大表的索引是否有任何代价,我应该考虑?问题,你需要查询表<代码>可能的朋友< /代码>吗?我只是想你可能可以按照用户划分表,当你查询时会受益匪浅,但是在很长一段时间内它可能会变成一场维护灾难run@ajreal:你是说每个用户都有自己的表吗?大约有一百万用户,这可能会使事情变得非常复杂。是的,我提到过这可能会变成维护灾难,每个表使用1k用户怎么样?假设您将所有数据放在一个表中,如果该表崩溃且不可恢复,甚至是可恢复的,您能忍受多长时间的停机?