SQL插入并选择多个列?

时间:2015-06-02 21:48:50

标签: mysql sql performance select sql-insert

所以我有一个看起来像这样的表:

沟通:(致电)

Timestamp            FromIDNumber ToIDNumber GeneralLocation 
2012-03-02 09:02:30  878          674        Grasslands 
2012-03-02 11:30:01  456          213        Tundra 
2012-03-02 07:02:12  789          654        Mountains
2012-03-02 08:06:08  458          789        Tundra 

我想创建一个包含所有不同FromIDNumberToIDNumber的新表。

这是SQL Fiddle

这有效:

INSERT INTO CommIDTemp (`ID`)
SELECT DISTINCT Communication.FromIDNumber
FROM Communication
UNION DISTINCT 
SELECT DISTINCT Communication.ToIDNumber
FROM Communication;

我得到了:

 ID  
 878
 456
 789
 674
 213
 654
 365

但我想知道是否有更有效的方法,因为我拥有的数据集有数百万行,而且我不知道UNION DISTINCT的性能。

我最初尝试过像

这样的东西
INSERT INTO CommIDTemp (`ID`) 
SELECT DISTINCT Communication.FromIDNumber
AND Communication.ToIDNumber 
FROM Communication; 

但这没有用......有没有其他方法可以更有效地做到这一点?我对SQL很陌生,所以非常感谢任何帮助,谢谢!

2 个答案:

答案 0 :(得分:2)

性能主要取决于表的索引方式。我没有看到在一次通过中完成所有操作的方法,因此我建议在FromIDNumber和ToIDNumber上单独建立索引。这应该使你的联盟中的每个语句都非常快,即使是很多行。

只需使用一个DISTINCT语句,您就可以加快速度。每个DISTINCT都需要一个sort / temp表。您可以从每个语句中删除DISTINCTUNION DISTINCT将确保您获得不同的值。

INSERT INTO CommIDTemp (`ID`)
SELECT Communication.FromIDNumber
FROM Communication
UNION DISTINCT 
SELECT Communication.ToIDNumber
FROM Communication;

旁注:UNION ALLUNION DISTINCT快,但根据您的要求,您需要UNION DISTINCT,可以简单地编写UNION

答案 1 :(得分:2)

第一件事:我没有这个大桌子的经验。因此,您必须自己测试以下tipp,以确定它们是否真的适用于您的情况:

1。在源表中创建索引

确保FromIDNumberToIDNumber列都有索引,即

ALTER TABLE Communication ADD INDEX (FromIDNumber);
ALTER TABLE Communication ADD INDEX (ToIDNumber);

2。尝试删除DISTINCT

我无法为您的示例找到更快的查询,但您可以在没有DISTINCT关键字的情况下尝试查询 - 使用UNION按定义仅返回不同的值。所以这个SQL给了我们与你当前查询相同的结果:

INSERT INTO CommIDTemp (`ID`)
SELECT FromIDNumber FROM Communication
UNION 
SELECT ToIDNumberFROM Communication;

3. 在临时表中使用主键

还可以通过将CommIDTemp.ID列设置为主键并使用INSERT IGNORE来尝试其他方法 - 如果您想要频繁更新表而不删除内容,这将非常有用:

CREATE TABLE CommIDTemp (ID INT PRIMARY KEY);

INSERT IGNORE INTO CommIDTemp (`ID`)
SELECT FromIDNumber FROM Communication
UNION
SELECT ToIDNumber FROM Communication;