我有一个包含大约 350 000 行的表,我最近从 MyISAM 存储引擎更改为 InnoDB。
我运行查询
UPDATE `users` SET `online` = 0
每次我的服务器启动时,使用 MyISAM 时完全没有问题。查询通常只影响几百行。查询的执行时间很慢,平均大约 1.5 秒,但我可以忍受。
现在我已更改为 InnoDB,但查询可能需要数十秒才能完成。
这是 mysql-slow.log 的一部分
# Query_time: 29.431546 Lock_time: 0.000091 Rows_sent: 0 Rows_examined: 348617
SET timestamp=1372505574;
UPDATE users SET online = 0;
这个特定的查询改变了 200 行的在线值,其他的已经是 0。
我能够通过将查询更改为
UPDATE `users` SET `online` = 0 WHERE `online` != 0
此查询耗时约 0.1 秒
现在,这是我的问题。为什么从 MyISAM 更改为 InnoDB 时时间会显着增加?
如果没有 WHERE 部分,查询怎么会这么慢?据我了解,MySQL 的查询优化器非常强大,但这表明恰恰相反。什么可能导致这个非常慢的查询执行时间?
MySQL 服务器版本为 5.5.31-0。