我的查询没有完成(我认为服务器内存不足)
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的记录。
答案 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)
每matchId
,period
,type
(应使用您的索引)并在之后加入相应的行。
将id
附加到现有索引matchPeriodType
也可能会有所帮助,因为只能使用此索引执行子查询。