約 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 です。