mariaDB データベースで大規模なデータセットを操作しています。 2 つのテーブルがあり、テーブル A には 5,700 万行が含まれ、テーブル B には約 500 行が含まれています。テーブル B は、テーブル A の列に関連する ID のサブセットです。 AテーブルBの行をすべて削除したいです。
テーブル A の例:
分類_id | ###名前###|
---|---|
メルセデス | |
川崎 | |
ライツ | |
HP |
30 | ###自転車###|
50 | ###ボート###|
したがって、この例では、テーブル A の最後の 2 行が削除されます (または、最初の 2 行のみを含むミラー化されたテーブルが作成されますが、これでも問題ありません)。 | 内部結合を使用して 2 番目のクエリを実行しようとしましたが、このクエリには数分かかり、メモリ不足例外が発生しました。 |
フィルター処理されたテーブルに含まれる行数が比較的少ないとのことなので、元のテーブル
注意事項:A
と同じ列と条件に一致する行を含む別のテーブルを作成し、その行を置き換えるのが最善の選択肢です。元のテーブルを削除してください。また、この ID 数では、結合の代わりにWHERE IN ()
を使用することもできます。そこで使用するフィールドにインデックスが付けられている限り、通常は way em> になります。もっと早く。すべてを一緒に入れて: ### リーリーデータをバックアップしてください!また、DROP TABLE を実行する前にクエリを徹底的にテストします。 StackOverflow でのランダムな応答によって 5,700 万行のデータが失われることは望ましくありません。-
- A
にインデックスまたは外部キーがある場合、これらはコピーされないため、手動で再作成する必要があります。最初に
SHOW CREATE TABLE Aを実行し、その構造をメモしておくことをお勧めします。あるいは、
SHOW CREATE TABLE Aの出力をテンプレートとして使用してテーブル
new_Aを明示的に作成し、代わりに
INSERT INTO new_A SELECT ...を実行することを検討することもできます。 code>CREATE TABLE new_A AS SELECT ...
を実行し、その後は同じクエリを使用します。
###これを試して:### リーリー