我上周将一个项目的所有MySQL表从MyISAM迁移到InnoDB,以支持交易.为此,我使用了alter table的命令.
大多数工作正常,但是一个特定的查询运行速度非常慢,它总是为表’/tmp/#sql_xxxx_x.MYI提供错误错误的密钥文件
后来我将问题缩小到2个表的内连接,即用户表和协议表.并且内连接发生在用户的外键字段(即agreement_id)和协议的主键字段(即id)之间.
用户表只有50,000行数据,协议表也有一行.我们已经为用户的agreement_id设置了索引.
无论如何,这似乎是一个非常轻量级的查询,但事实证明它是整个瓶颈.
这是完整的协议架构:
CREATE TABLE IF NOT EXISTS `agreement` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`remark` varchar(200) NOT NULL,
`content` longtext NOT NULL,
`is_active` tinyint(1) NOT NULL,
`date_stamp` datetime NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
我怀疑的一件事是协议表中的注释的longtext字段,但我们没有使用该字段进行内连接,实际上即使我们没有在查询结果中选择注释,查询也很慢.
最后,我们将协议表从innoDB转换回MyISAM,而不是一切正常.查询在不到1秒的时间内完成.
现在,我的问题是这里究竟发生了什么?这是否意味着一旦innoDB表包含任何文本字段,那么该表不能用于内连接?
我希望我能够知道真正的原因,以便我将来可以避免同样的问题.
非常感谢.