mysql - InnoDB 和 tmp_table 问题

标签 mysql innodb

我在 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. 

请求永远不会完成。

一些说明:

  1. 如果我在 Workbench 中执行相同的请求,它就会成功。
  2. 如果我删除 ORDER BY 子句,它就会成功。
  3. 如果我将引擎从 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/

相关文章:

php - MySQL 更新查询 - 竞争条件和行锁定会遵守 'where' 条件吗? (php, PDO, MySQL, InnoDB)

mysql - AI专栏与Percona XtraDB Cluster的数值存在差距

python - 如何使用 Python namedtuples 将行插入 mySQL 数据库

php - Codeigniter 数据库插入数据

python - ValueError:不支持的格式字符 'T' (0x54)

mysql - 转换mysql数据库,非常基础

mysql - 按行计数的计数

mysql - 为什么 Next-Key lock 这么叫呢?

php - MySQL数据库行数优化

mysql - Innodb页面大小设置