我在 MySQL 服务器中有一组三个 InnoDB 表,我在上面执行了一个简单的 SELECT。
SELECT s.type, s.Price,l.ratio, o.type,
FROM Structures s, Orders o, Legs l
WHERE s.type in ('type1','type2',...)
AND o.ID >= s.ID* 10
AND o.ID<= s.ID * 10 + s.orderNumber -1
AND l.ID >= s.ID * 10
AND l.ID <= s.ID * 10 + s.legNumber -1
ORDER BY s.type, s.FurthestExpiration, s.NearestExpiration
添加一定数量的行后(结构大约 1,800,边和订单大约 3,000),我无法执行这个请求,我在 MySQL workbench 中看到请求的状态是
Copying to the tmp table.
请求永远不会完成。
一些说明:
- 如果我在 Workbench 中执行相同的请求,它就会成功。
- 如果我删除 ORDER BY 子句,它就会成功。
- 如果我将引擎从 InnoDB 切换到 MyISAM,它就可以工作。
我不太关心使用 InnoDB 或 MyISAM,但我不确定这是否与 InnoDB 不兼容,我怀疑我的数据库参数/设计存在一些问题。
感谢任何线索!
最佳答案
我不确定我是否同意这是一个“简单选择”。你想在这里做什么?因为如果我没看错的话,这将是一个巨大的(隐式)连接。你是这样加入的:FROM Structures s, Orders o, Legs l
,但是没有s.id = o.id
之类的东西,只有比较.你的结果集有多大?可能也没有简单的索引,但您必须为此检查 EXPLAIN
。
无论如何,我认为没有理由永远不会完成,尽管由于查询本身效率不高,可能需要很长时间才能完成此 Copying to the tmp table.
状态。 (显然取决于查询效率低下的事实 if :))
也许您在该数量的行上遇到了某种限制(缓存、内存等),因此它开始变得非常慢,而且看起来还没有完成。
我的建议是尽可能进行一些显式连接(table1 t1 JOIN table2 t2 ON t1.id = t2.id
),或者至少检查查询的“繁重程度”。
关于mysql - InnoDB 和 tmp_table 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5964475/