我是MySQL的新手,我第一次尝试使用LEFT Joins。虽然返回的结果是预期的,但查询所花费的时间太长了。
我正在加入3个表,当我单独运行查询时,数据将在0.0002秒内返回。使用连接时,查询最多需要300秒。
evmbd有6012行我需要返回,我只想要将xlba和3pla表中的一列连接到naa上我一直在阅读有关优化LEFT JOIN查询的内容,并已在INDA上添加了naa列上的所有3个表。
SELECT e.cluster,e.vm,e.TotalCapacityGB,e.naa,p.array,x.array
FROM evmbd AS e
LEFT JOIN xlba AS x ON x.naa like replace(e.naa,'naa.','') AND x.date = (select max(date) from xlba )
LEFT JOIN 3pla AS p ON p.naa = replace(e.naa,'naa.','') AND p.date = (select max(date) from 3pla )
WHERE e.date = (select max(date) from evmbd)
GROUP BY e.cluster, e.vm
ORDER BY e.cluster, e.vm
任何帮助都会令人惊叹,以及有关高级查询的任何文档
答案 0 :(得分:1)
我不知道你的牌桌,但这可能会有所帮助:
DECLARE @MAX_XLBA DATETIME
DECLARE @MAX_3PLA DATETIME
DECLARE @MAX_EVMBD DATETIME
SET @MAX_XLBA = (select max(date) from xlba)
SET @MAX_3PLA = (select max(date) from 3pla)
SET @MAX_EVMBD = (select max(date) from evmbd)
SELECT e.cluster,e.vm,e.TotalCapacityGB,e.naa,p.array,x.array
FROM evmbd AS e
LEFT JOIN xlba AS x ON x.naa = LTRIM(RTRIM(SUBSTRING(e.naa,4,15))) AND x.date = @MAX_XLBA
LEFT JOIN 3pla AS p ON p.naa = LTRIM(RTRIM(SUBSTRING(e.naa,4,15))) AND p.date = @MAX_3PLA
WHERE e.date = @MAX_EVMBD
也许如果在查询运行时没有计算日期,性能可能会更好。对于您正在进行的替换也是如此。
此致
答案 1 :(得分:1)
当您加入replace函数时,它必须使用replace计算每一行以查看它是否匹配。这使您选择每条记录,然后运行替换。此外,当您的第二个比较是使用当前行中的字段的子选择。因此,对于e中的每个可能的行,您将对x中的每一行进行测试,对于每一行,您都要对p的每一行进行测试。对于x e p中的每一个,您还运行另一个选择查询。你肯定给服务器一个锻炼。你可以做很多事情来加快速度。
执行#1可能会消除大部分减速,但这取决于与您的联接匹配的行数。
对于#2
在罗德里戈的帖子中,他给出了一个例子,但你不需要修剪功能。此外,为了获得最佳性能,您还应该为日期字段建立索引。
SET @MAX_XLBA = (select max(date) from xlba)
SET @MAX_3PLA = (select max(date) from 3pla)
SET @MAX_EVMBD = (select max(date) from evmbd)
SELECT e.cluster,e.vm,e.TotalCapacityGB,e.naa,p.array,x.array FROM evmbd AS e
LEFT JOIN xlba AS x ON x.naa = e.naa AND x.date = @MAX_XLBA
LEFT JOIN 3pla AS p ON p.naa = e.naa AND p.date = @MAX_3PLA
WHERE e.date = @MAX_EVMBD
答案 2 :(得分:-1)
对于数据量巨大的项目,我在SQLite中遇到了同样的问题。太多的连接正在减慢程序的速度。在那里,我使用以下解决方案: