为什么这个查询没有运行?

时间:2012-10-12 11:37:19

标签: mysql sql performance

我的查询没有完成(我认为服务器内存不足)

SELECT fOpen.*, fClose.*
FROM (
    SELECT of.*
    FROM fixtures of
        JOIN (
            SELECT MIN(id) id
            FROM fixtures
            GROUP BY matchId, period, type
        ) ofi ON ofi.id = of.id
) fOpen
JOIN (
    SELECT cf.*
    FROM fixtures cf
        JOIN (
            SELECT MAX(id) id
            FROM fixtures
            GROUP BY matchId, period, type
        ) cfi ON cfi.id = cf.id
) fClose ON fClose.matchId = fOpen.matchId AND fClose.period = fOpen.period AND fClose.type = fOpen.type

这是它的解释:

如果我单独运行它们,'和'cf'的那2个子查询需要大约1.5秒运行。

'id'是一个PRIMARY INDEX,有一个名为'matchPeriodType'的BTREE INDEX,按顺序有3列。

更多信息:MySQL 5.5,512MB的服务器内存,该表有大约400k的记录。

2 个答案:

答案 0 :(得分:1)

不确定matchid / period / type的唯一性。如果是唯一的,您将加入400k记录而不是400k记录,可能会丢失索引。

然而,似乎可能不需要2个主要子选择。你可以加入固定装置对抗自身,然后加入子选择以获得最小值和最大值。

答案 1 :(得分:1)

我尝试重写您的查询,以便更容易阅读并且应该能够使用您的索引。希望我做对了,没有你的数据就无法测试。

SELECT fOpen.*, fClose.*
FROM (
  SELECT MIN(id) AS min_id, MAX(id) AS max_id
  FROM fixtures
  GROUP BY matchId, period, type
) ids
JOIN fixtures fOpen  ON ( fOpen.id  = ids.min_id )
JOIN fixtures fClose ON ( fClose.id = ids.max_id );

这个MIN(id)MAX(id)matchIdperiodtype(应使用您的索引)并在之后加入相应的行。

id附加到现有索引matchPeriodType也可能会有所帮助,因为只能使用此索引执行子查询。