2011-01-09 13 views
1

このクエリは、mysqlの低速クエリログに表示されます。これには11秒かかります。なぜこのクエリが遅いのですか?

INSERT INTO record_visits 
(record_id, visit_day) 
VALUES 
('567', NOW()); 

の表は、501043件のレコードを持っているし、それが構造だ次のようになります。間違っている可能性が

CREATE TABLE IF NOT EXISTS `record_visits` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `record_id` int(11) DEFAULT NULL, 
    `visit_day` date DEFAULT NULL, 
    `visit_cnt` bigint(20) DEFAULT '1', 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `record_id_visit_day` (`record_id`,`visit_day`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ; 

何?なぜこのINSERTに時間がかかりますか?

UPDATE

私はすべての問題の原因となったものを、見つけました。そのテーブルに非常に重い "ON INSERT"トリガが作成されました。 MyISAMのテーブルロックと一緒に、INSERTクエリに膨大なクエリ時間を与えました。おそらくこれが@Oswaldのコメントでこのような状況を再現できなかった理由です。

本当の問題は、MySQLはトリガー内でクエリを記録しないことと、アプリケーションのプロファイリング時に常にそれらについて覚えておく必要があることです。

皆様、お手数をおかけしていただきありがとうございます。回答は解決策に近づいています。

+0

MySQLサーバのヘルプを再起動しますか? –

+1

あなたのUNIQUEインデックスのためでしょう。しかしそれはそれほど遅くすべきではありません。 – alexn

+0

@Timeマシン番号は、再起動後も変わりません。 –

答えて

2

私はそれが遅いクエリではないと思っていますが、テーブルをロックしているサーバーで他のクエリを実行しています。 MyISAMはテーブルレベルのロックを使用しているので、テーブルが必要なクエリは、異なるテーブルにアクセスしてもテーブルを必要とするクエリをすべてロックします。たとえば、長時間実行されるSELECT問合せを頻繁に使用する場合、INSERT、UPDATEおよびDELETE問合せは、問合せを発行したときに実行されていたすべての選択が完了するまで実行できません。

挿入が実行されている間に別のプロンプトからSHOW PROCESSLISTを実行すると、「ロックされた」状態になっている可能性があります。それが別の状態であることが判明し、それをブロックしている長期実行選択肢がない場合は、問題を絞り込むのに役立ちますので、それを通知する必要があります。

0

MySQLは分かりませんが、UNIQUE KEYはvisit_day列にインデックスがあることを意味しますか?そうでない場合は、作成してみてください。

+0

UNIQUE KEYは、 'record_id'と'visit_day'列に2列のインデックスがあることを意味します。私が知る限り、インデックスを追加するだけで挿入と更新が遅くなりますが、どのように役立ちますか? –

+0

挿入が行われるたびに、一意のキーを確認する必要があります。したがって、ユニークなキーを持ちながらインデックスがない場合、すべてのインデックスは、重複する値が存在しないことを確認するために、キー列を順次スキャンします。 – Daniel

+0

私は一意の宣言を間違って読んでいますが、私は両方のキーに結合されたインデックスが必要と仮定します。 – Daniel

1

このテーブルにデータを追加しようとすると、mysqlはUNIQUEインデックスのためにすべてrecord_id_visit_dayの行をチェックします。

関連する問題