0

私の仕事は、操作中に影響を受けなかったすべてのエンティティをデータベースから削除することです。2 つの列を持つ別のテーブルを作成しました。最初はテーブルの名前を再設定し、2 番目はそのテーブル内のレコードの ID です。

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

このレコードを編集すると、次のデータが edit_entities に入れられます。

table | id
puppy | 1

次に、影響を受けていないエンティティ (edited_entities テーブルにない ID) をすべて削除する必要があり、次のようにします。

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

このような操作 (MySql) に最適なエンジンは何でしょうか? デフォルトのデータベース エンジンは InnoDB です。メモリ(ヒープ)について考えましたが、削除操作を高速化できるかどうかはわかりません。

必要な操作を最適化するにはどうすればよいか提案があれば、喜んでここにいたします。

子犬のテーブルに列を追加したくありません。

4

1 に答える 1

0

トランザクションの最後にディスクに移動する必要がないため、メモリは高速になります。この場合、最初に HASH インデックスではなく BTREE を試します。これは、ディスク上のテーブルと同様に、部分的な複合インデックスを使用できるためです。

また、挿入操作と削除操作の準備済みステートメントを試してみてください。処理の前にそれぞれを準備してから、関連するパラメーターを使用して呼び出します。SQL を解析する必要がないため、高速になる可能性があります。しかし、かなりの量のメモリを消費するため、システム全体が少し遅くなる場合があります。

もう 1 つのオプションは、実験的な ' HandlerSocket ' 機能で、 Percona サーバーのような MySQL のいくつかのフォークで利用できます。これにより、MySQL テーブルに NoSQL ストアとしてアクセスでき、パフォーマンスが大幅に向上しますが、ACID に完全に準拠しています。(Percona の人々はパフォーマンスの狂信者です。たとえ HandlerSocket を使用できないとしても、彼らのフォークを必ずテストしてください)

最後に、実行可能な (ただし、より多くの作業が必要な) オプションは、別のインメモリ データベースです。私はRedisを使用する傾向があります。これは、「値」が有用なデータ構造であるというひねりを加えた、非常に高速なメモリ内のキーと値のストアです。あなたの場合、次のような各テーブルの一連の ID を保存できます。

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

要素をセット ( ) に追加するのは単純な (かつアトミックな) 操作SADD tokeep:puppy 76であり、最後にそれらすべてをフェッチして SQLDELETE WITH id NOT IN (...)操作を作成します。

そして、私が考えている最後のオプション (そして、あなたにとってはまだ多くの作業があります) は、すべてを同じストアに置くことです: 以前は redisql と呼ばれていた Redis のフォークがありますが、現在はAlchemy Databaseになっています。SQL テーブルを Redis に追加し、NoSQL のパフォーマンス上の利点のほとんどを維持します。そのため、「通常の」テーブルを Alchemy の SQL テーブルとして保持し、「tokeep」セットを同じサーバーの NoSQL に保存し、最後に次のことを行うことができます。

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

バム!

于 2011-01-25T12:15:03.157 に答える