トランザクションをサポートするために、先週、1 つのプロジェクトのすべての MySQL テーブルを MyISAM から InnoDB に移行しました。これには のコマンドを使用しalter table
ました。
ほとんどは正常に動作しますが、特定のクエリの実行が非常に遅く、常にエラーが発生しますIncorrect key file for table '/tmp/#sql_xxxx_x.MYI
user
後で、問題をテーブルとテーブルの 2 つのテーブルの内部結合に絞り込みましたagreement
。user
そして、(ie ) の外部キー フィールドと(ie )agreement_id
の主キー フィールドの間で内部結合が行われました。agreement
id
user
テーブルには 50,000 行のデータしかありませんが、テーブルagreement
には 1 行しかありません。そして、ユーザーのインデックスを設定しましたagreement_id
。
いずれにせよ、これは非常に軽量なクエリのように見えますが、ボトルネック全体であることが判明しました。
の完全なスキーマは次のagreement
とおりです。
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 ;
私が疑問に思っていることの 1 つは、テーブルremark
内の longtext フィールドですagreement
が、内部結合にフィールドを使用していません。実際、remark
クエリ結果で選択しなくても、クエリは遅くなります。
最後に、 の表をagreement
からinnoDB
に戻しMyISAM
、すべてが正常になるようにしました。クエリは 1 秒未満で終了します。
さて、私の質問は、実際にここで何が起こっているのでしょうか? innoDB テーブルにテキスト フィールドが含まれると、テーブルを内部結合に使用できなくなるということですか?
将来同じ問題を回避できるように、本当の理由を知ることができればいいのにと思います。
どうもありがとう。