mysql - SQL插入并选择多列?

标签 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 的新手,所以非常感谢任何帮助,谢谢!!

最佳答案

第一件事:我没有使用这种大表的经验。因此,您必须自己测试以下提示,看看它们是否真的适用于您的情况:

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;

关于mysql - SQL插入并选择多列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30607214/

相关文章:

php mysql 信息检索

mysql查询从前3个字母为alpha(字符)的列中获取所有记录

php - MySQL 选择(Zend Framework 数据库选择)

java - 使用 Stanford CoreNLP 进行惰性解析以仅获取特定句子的情绪

css - 在网络上加载高分辨率图像是否有良好的非阻塞模式?

mysql - 将数组插入MySQL表中

sql - 使用 PostgreSQL 的 PgAdmin-III 导出数据库

sql - 使用 postgresql 随机排序时的确定性顺序

php - Apache 正在工作,但 Mysql 模块无法在 xampp v3.2.1 windows 7 上工作

Java程序占用太多内存