优化在MySQL

时间:2017-08-10 09:57:26

标签: mysql sql join query-optimization

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

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万行,表2有大约100行。运行此查询并编写csv文件大约需要一个小时。我希望有一些方法来编写比这更快的查询。我无法相信这个少量数据的查询在服务器上需要一个小时。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我找到了答案,对像我这样的数据库的初学者来说可能会有所帮助。特别是在MySQL中。

答案上述评论帮助我研究了索引的核心,并从this tutorial索引了我的列。我将我用作外键的所有列(在我的情况下有2列)feature1feature2编入索引。结果非常快。围绕70 minutes的查询几乎7 seconds1000X更快

答案 2 :(得分:0)

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