2012-04-24 13 views
1

私は少し問題があります。 私は2つのテーブル: eventsmultimediaを持っています。 eventsは、主キーがIDで、device_idcreated_atフィールドによって形成されたインデックスがあります削除SQLクエリは非常に遅いです

id, 
device_id 
created_at field 

を持っています。

multimediaテーブルは、フォロワフィールドを有する:

id 
device_id 
created_at 
data (this field is a blob field and contains a 20k string) 

主キーはIDで、device_idcreated_byフィールドによって形成されたインデックスがあります。

問題は、データの前にcreated_atというレコードを削除したいときです。

クエリ:

DELETE FROM events WHERE device_id = #{dev[0]} 
AND created_at <= '#{mm_critical_time.to_s}' 

はokです。 5または6秒でdeleteレコード。

クエリ

DELETE FROM multimedia WHERE device_id = #{dev[0]} 
AND created_at <= '#{mm_critical_time.to_s}' 

は私にいくつかの問題を与え、実行が開始し、決してそれを終えます。

何が問題ですか?

答えて

2

おそらく、検索する列のインデックスを作成する必要があります。

CREATE INDEX device_created_index 
ON multimedia (device_id, created_at); 

あなたは私がSELECT EXPLAIN使用についてはこちらを与えた答えを参照してください、あなたのクエリの最適化についての詳細を知りたい場合は、次のis there better way to do these mysql queries?

+0

私はすでにそのインデックス – Dabidi

+0

を作成しましたそれから私は私がにリンクされている答えで述べたように、あなたのクエリをEXPLAIN示唆しています。 –

0

条件の順序が重要であり、あなたたちに語ったhavent'tあなたデータベース・サーバが、少なくともオラクルでは、そう

DELETE FROM multimedia WHERE 
created_at <= '#{mm_critical_time.to_s}' 
AND device_id = #{dev[0]} 

のようにそれらを逆転しようとしているか、私たちの最速部分の内側のクエリ

DELETE FROM multimedia WHERE 
created_at <= '#{mm_critical_time.to_s}' 
AND device_id in (select device_id from multimedia where device_id = #{dev[0]}) 

また、私はいつも遅いクエリを分解し、ボトルネックがどこにあるかを知るために速度に関する部分をテストします。 いくつかのプログラムでは、クエリの所要時間を表示し、Rubyではベンチマークを使用することができます。テスト中にselectを使用して削除を補うことができます。

のでテスト:

select * FROM multimedia WHERE created_at <= '#{mm_critical_time.to_s}' 

select * from multimedia WHERE device_id = #{dev[0]} 

成功..

0

一部始終を知らなくても、リレーショナル・データベースでのパフォーマンス上の問題の解決策を与えることは非常にナイーブです、多くの変数が関係しているからです。あなたがが、私は主キーとインデックスを削除するために、あなたを提案し、実行します提供されたデータについては

CREATE UNIQUE CLUSTERED INDEX uc ON events (device_id, created_at); 
CREATE UNIQUE CLUSTERED INDEX uc ON multimedia (device_id, created_at); 

あなたが本当にidフィールドの一意性を強制する必要がある場合は、1つのユニークな非クラスタ化インデックスを作成しますこの各テーブルの列(それはより多くの時間を消費するには、deleteコマンドを原因となります)のために:

CREATE UNIQUE INDEX ix_id ON events (id); 
CREATE UNIQUE INDEX ix_id ON multimedia (id);