Mysql 为什么';这个查询不能运行吗?

Mysql 为什么';这个查询不能运行吗?,mysql,sql,performance,Mysql,Sql,Performance,我的查询尚未完成(我认为服务器内存不足) 这是对它的解释: 如果我分别运行'of'和'cf'这两个子查询,则运行它们大约需要1.5秒 “id”是一个主索引,有一个名为“matchPeriodType”的BTREE索引,该索引按该顺序包含这3列 更多信息:MySQL 5.5512MB服务器内存,该表有大约400k条记录。不确定matchid/period/type的唯一性。如果是唯一的,则将400k记录与400k记录合并,可能会丢失索引 但是,似乎没有必要选择2个主要子选项。您可以将fixtur

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

这是对它的解释:

如果我分别运行'of'和'cf'这两个子查询,则运行它们大约需要1.5秒

“id”是一个主索引,有一个名为“matchPeriodType”的BTREE索引,该索引按该顺序包含这3列


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

不确定matchid/period/type的唯一性。如果是唯一的,则将400k记录与400k记录合并,可能会丢失索引


但是,似乎没有必要选择2个主要子选项。您可以将fixture自身和子select连接起来,以获得最小值和最大值。

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

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 );
这一个根据
matchId
period
type
(应该使用您的索引)获取
MIN(id)
MAX(id)
,并随后加入相应的行


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

不确定,但
是保留字。这可能无关紧要,因为MySQL会根据它所使用的上下文知道它的标识符,但一般来说,不使用保留字作为别名是一个很好的做法。它可能是内存。512MB对于服务器来说是非常小的。关键字的
没有问题,但我明白你的意思,谢谢。这很有效,但我很遗憾它没有使用我的“匹配,周期,类型”索引作为分组依据,当我强制索引时,它会变慢,但是
id
是主要的,我已经在表上有了一些索引。让我告诉你:你试过我建议的扩展索引了吗?我试过了,
EXPLAIN
告诉我它正在使用它,但速度没有差别。至少没有这些记录。不管怎样,我还是要留着它。谢谢你的建议。(:处理Peters代码时,我想知道子选择是否没有带回任何键信息。可能也会从子选择中带回matchId、句点、类型(通常在选择中有group by字段是个好主意),然后加入这些以及ID
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 );