MySQL查询需要5分钟才能执行

时间:2017-09-05 14:11:00

标签: mysql performance left-join query-optimization

我是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

任何帮助都会令人惊叹,以及有关高级查询的任何文档

3 个答案:

答案 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. 使所有表格中的naa字段保持一致。删除“naa”。在e上,或将其添加到其他人,因此您可以进行直接比较,而不是喜欢或替换功能。
  2. 预取您需要的最长日期,而不是运行子选择。罗德里戈对此有正确的想法。
  3. 如果您不能执行其中任何一项操作,请选择截断的值并将日期匹配到临时表中,然后运行带有连接的选择。
  4. 执行#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中遇到了同样的问题。太多的连接正在减慢程序的速度。在那里,我使用以下解决方案:

  • 1。您在代码中有2个左连接,请保持最有效的一个。获得结果后,您可以在内存中计算另一个。
  • 2。在临时表中创建一个子集。然后计算另一个连接。