2011-01-25 4 views
0

私の仕事は、操作中に影響を受けなかったすべてのエンティティをデータベースから削除することです。私は2つの列を持つ別のテーブルを作成し、最初にテーブルの名前をrepresetsし、2番目のテーブルのレコードのIDです。例えば大きい "タイプ値"テーブルを処理するためのMysqlエンジンを選択

CREATE TABLE edited_entities (
     table VARCHAR(50) not null, 
     id BIGINT(20) not null) 

私はテーブル

CREATE TABLE puppy(
     id BIGINT(20) not null, 
     name VARCHAR(20) not null) 

とそれにレコード

id | name 
1 | Rex 

を持っている場合、私はこのレコードを編集する場合、私はedited_entitiesに次のデータを置くには:

table | id 
puppy | 1 

次に、削除する必要がありますE以外のすべての影響を受けた(IDはedited_entitiesテーブルにない)エンティティと、私は次の操作を行います

delete from puppy where id not in 
    (select ee.id from edited_entities ee where ee.table= 'puppy'); 

は、私は(MySQLの)操作のような種類のための最高のエンジンは何だろうか?デフォルトのdbエンジンはInnoDBです。私はメモリ(ヒープ)について考えていましたが、削除操作が高速かどうかはわかりません。

ご要望があれば、どのように必要な操作を最適化することができますか?私はここでそれをうれしく思います。

私は子犬のテーブルに追加の列を追加しないでください。

+0

さまざまなvarcharサイズが目的に合っていないと思いますか? –

答えて

0

メモリトランザクションの終了時にディスクに移動する必要がないため、高速です。この場合は、ディスク上のテーブルのように、部分的複合インデックスを使用できるので、最初はBTREEでハッシュインデックスではなく、試してみます。

また、挿入操作と削除操作の準備文を試してください。処理前にそれぞれの準備を行い、関連するパラメータで起動してください。 は、SQLを解析する必要がないため、処理速度が向上します。軽微な量のメモリを取るため、システム全体が少し遅くなる場合もあります。

もう一つのオプションは、Percona serverのようなMySQLのいくつかのフォークで利用できる実験的な 'HandlerSocket'機能です.MySQLテーブルにNoSQLストアとしてアクセスすることができます。 (Perconaの人々はパフォーマンスの狂気です;あなたがHandlerSocketを使うことができなくても、そのフォークをテストしてください)

最後に、実行可能なオプションはメモリ内の別のデータベースです。私はと一緒に行く傾向があります。これは、非常に高速なインメモリのKey-Valueストアであり、「値」が有用なデータ構造であることを追加しました。あなたのケースでは、あなたはそれがセット(SADD tokeep:puppy 76)に要素を追加するために、単純な(とアトミック)の動作だが、各テーブルに

tokeep:puppy => 1,4,6,76..... 

のようなものをIDのセットを格納することができ、そして最後に、あなたはそれらをフェッチすべてのSQLを作成するDELETE WITH id NOT IN (...)操作

私は(とあなたのためのより多くの仕事を考える)最後のオプションは、すべて同じ店舗に置くことです:以前はredisqlと呼ばれる、今は今はAlchemy Databaseです。 SQLテーブルをRedisに追加し、NoSQLのパフォーマンス上の利点の大部分を維持します。だから、あなたは、錬金術でSQLテーブルとしてあなたの「通常の」テーブルを持っているあなたの「tokeep」は同一サーバ上のNoSQLに設定し保存し、そして最後に行うことができます:

DELETE FROM puppy WHERE id NOT IN ($SMEMBERS tokeep:puppy); 

バムを!

+0

あなたの答えをありがとう! – Zalivaka

関連する問題