2009-05-05 10 views
8

私は10^7行以上のMyISAMテーブルを持っています。データを追加するときには、最後に〜10行を更新する必要があります。それらを削除してから新しいものを挿入する方が速いのですか、それともそれらの行を更新する方が速いのですか?更新すべきデータは索引の一部ではありません。インデックス/データ断片化はどうですか?MySQLのパフォーマンスを削除または更新しますか?

答えて

20

UPDATEはるかに高速です。

UPDATEの場合、テーブルレコードは新しいデータで書き直されています。 (あなたがPCTFREE制限をヒットした場合)あなたDELETE

をインデックスを更新する必要があります(あなたが変更する必要がある列だけでなく、あなたが行全体を削除し、覚えている)とデータブロックを移動させても良い

そして、すべてのこれはINSERTで再度行わなければなりません。

あなたは常に

INSERT ... ON DUPLICATE KEY UPDATE 

の代わりREPLACEを使うべき理由です。

鍵違反の場合は前者はUPDATE、後者の場合はDELETE/INSERTです。

3

更新が速いです。あなたはまた、より多くの詳細がdocumentation

+0

おい、3分で速かった、それは何の不公平? ) –

1

は論理的= 2アクション、UPDATE = 1つのアクションを追加+ DELETE更新読む

INSERT INTO table (a,b,c) VALUES (1,2,3) 
    ON DUPLICATE KEY UPDATE c=c+1; 

についてDUPLICATE KEY UPDATE ON INSERTを使用することができます。また、auto_incrementに新しい変更レコードIDを削除して追加すると、そのレコードに壊れている関係がある場合や、更新が必要な場合もあります。私はUPDATEのために行くだろう。

0

ここで、Column = 'something'は、検索条件がインデックス内にある限り、インデックスを使用する必要があります(検索またはスキャンが全く異なる問題であるかどうか)。

これらの更新をたくさん行っていますが、基準列にインデックスがない場合は、使用している列にインデックスを作成することをお勧めします。物事をスピードアップするのに役立つはずです。

2

パフォーマンスのためにデータを削除または更新するのではなく、パーティション化を検討します。

http://dev.mysql.com/doc/refman/5.1/en/partitioning-range.html

これは歴史的にデータを保持し、パフォーマンスを低下させないようになります。

関連する問題