MySQL中连接3个表的性能优化

MySQL中连接3个表的性能优化,mysql,sql,join,query-optimization,Mysql,Sql,Join,Query Optimization,我在MySQL数据库中有3个表,我想编写一个csv文件连接这3个表。一个是master_表,另外两个是表1和表2。下面是我要联接这三个表的查询 USE db_test; SELECT 'feature1', 'feature2', 'feature3', 'feature4', 'feature5', 'feature6', 'feature7', 'feature8' UNION ALL SELECT master_table.feature1, master_table.feature2,

我在MySQL数据库中有3个表,我想编写一个csv文件连接这3个表。一个是master_表,另外两个是表1和表2。下面是我要联接这三个表的查询

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内存和8个内核的服务器上运行它

问题
主表大约有35万行。表1有30万行,表2大约有100行。运行此查询和编写csv文件几乎需要一个小时。我希望有办法编写比这更快的查询。我不敢相信在服务器上查询如此少量的数据需要一个小时。

您可能缺少索引。如果您可以发布SHOW CREATE TABLE master_TABLE、SHOW INDEX FROM master_TABLE、SHOW INDEX FROM TABLE 1、SHOW INDEX FROM TABLE 2,那么我们可以识别您发布的查询所需的缺失索引。我们还将迅速了解表中有多少行以及索引列的基数。
如果您还可以在原始问题中添加

显示全局状态和显示全局变量您的一些同行可以查看您的系统容量,并检查与配置机会有关的许多问题,以进行改进

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


回答上述评论帮助我研究了索引的核心,我从中为我的专栏编制了索引。我索引了所有用作外键的列(在我的例子中有两列)
feature1
feature2
。结果非常快。这个查询大约花费了
70分钟
几乎花费了
7秒
,这比
1000X
快了

祝贺您使用了您的学术经验和社区对查找地点的建议。作为后续行动,如果您还可以在原始问题中添加
显示全局状态和显示全局变量您的一些同行可以查看您的系统容量,并检查与配置相关的许多问题,以便改进以缩短7秒。继续,继续学习。

表1.功能11上有索引吗?可以显示查询执行计划吗?使用列标题的静态行是一件奇怪的事情。为什么不给数据列一个友好的别名(或者完全由客户决定演示文稿)?需要进行大量的重新设计。任何时候当你有列命名为x1,x2,x3等,你可以确定你的设计不是最优的。这些连接的基数是什么?如果您为
feature11
feature22
找到了多个匹配项,这会创建很多新行。我是SQL新手。我只是用我的学术经验尝试了上面的问题,所以我知道这可能很奇怪。我只想要一些建议,比如在第一条评论中建立索引