所以我有一个看起来像这样的表:
通讯:(调用电话)
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
我想创建一个新表,其中包含所有不同的 FromIDNumber
和 ToIDNumber
。
这是它的 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 的新手,所以非常感谢任何帮助,谢谢!!
最佳答案
第一件事:我没有使用这种大表的经验。因此,您必须自己测试以下提示,看看它们是否真的适用于您的情况:
1.在源表中创建索引
确保 FromIDNumber
和 ToIDNumber
两列都有索引,即
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;
关于mysql - SQL插入并选择多列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30607214/