2017-08-10 178 views
-2

我在MySQL数据库中有3个表,我想写一个连接这3个表的csv文件。一个是master_table,另外两个是table1和table2。这是我的查询加入三个表优化在MySQL中连接3个表的性能

USE db_test; 
SELECT 'feature1', 'feature2', 'feature3', 'feature4', 'feature5', 'feature6', 'feature7', 'feature8' 
UNION ALL 
SELECT master_table.feature1, master_table.feature2, master_table.feature3, master_table.feature4, master_table.feature5, table1.feature6, table1.feature7, table2.feature8 
FROM (master_table RIGHT JOIN table1 
ON master_table.feature1 = table1.feature11) 
LEFT OUTER JOIN table2 
ON table2.feature22 = master_table.feature2 
INTO OUTFILE 'datafile.csv' 
CHARACTER SET 'utf8' 
FIELDS TERMINATED BY '\t' 
LINES TERMINATED BY '\n'; 

此查询工作正常。我在64GB RAM和8个内核的服务器上运行它。

问题 主表有大约35万行。 table1有30万行,而table 2有大约100行。运行此查询并写入一个csv文件需要将近一个小时。我希望有一些方法可以写出比这更快的查询。我无法相信对这一小部分数据的查询需要在服务器上花费一个小时。

+1

你有'table1.feature11'上的索引吗?你可以显示查询执行计划吗? – Thilo

+1

带列标题的静态行是一件很奇怪的事情。为什么不只给数据列一个友好的别名(或者将演示文稿留给客户)呢? – Thilo

+1

重要的重新设计是需要的。任何时候你有名为x1,x2,x3等的列,你都可以确定你的设计不是最优的。 – Strawberry

回答

1

您很可能缺少索引。如果您可以发布SHOW CREATE TABLE master_table,SHOW INDEX FROM master_table,SHOW INDEX FROM table1,SHOW INDEX from table2,我们可以识别您发布的查询所需的缺失索引。我们也会尽快知道表中有多少行以及索引列的基数。
如果您还可以在您的原始问题中添加
的结果显示全局状态和显示全局变量您的某些同行可能会检查您的系统容量并检查与配置改进相关的许多问题。

0

我想出了答案,它可能对像我这样的数据库初学者有帮助。尤其在MySQL中。

ANSWER上述评论帮助我研究了索引的核心,并从this tutorial索引了我的专栏。我索引我用作外键的所有列(在我的情况下有2列)feature1feature2。结果非常快。大约需要70 minutes的查询花了差不多7 seconds这是1000X更快

0

祝贺您使用您的学术经验加社区建议的地方看看。作为后续,如果您还可以在您的原始问题中添加 显示全局状态和显示全局变量的结果,您的某些同行可能会检查您的系统容量,并检查与配置改进相关的许多问题以减少7秒。按下,继续学习。