異なるテーブルに基づいて巨大な MariaDB/Mysql テーブルを「フィルタリング」する
P粉287345251
P粉287345251 2023-09-07 10:51:26
0
2
599

mariaDB データベースで大規模なデータセットを操作しています。 2 つのテーブルがあり、テーブル A には 5,700 万行が含まれ、テーブル B には約 500 行が含まれています。テーブル B は、テーブル A の列に関連する ID のサブセットです。 AテーブルBの行をすべて削除したいです。

テーブル A の例:

###名前### 20308070テーブル B の例:
分類_id
メルセデス
川崎
ライツ
HP

分類_id ###タイプ### 20 ###車### ###自転車### 40 ###バス### ###ボート### したがって、この例では、テーブル A の最後の 2 行が削除されます (または、最初の 2 行のみを含むミラー化されたテーブルが作成されますが、これでも問題ありません)。 内部結合を使用して 2 番目のクエリを実行しようとしましたが、このクエリには数分かかり、メモリ不足例外が発生しました。 この問題を解決する方法について何か提案はありますか?
30
50
P粉287345251
P粉287345251

全員に返信(2)
P粉258083432

フィルター処理されたテーブルに含まれる行数が比較的少ないとのことなので、元のテーブル 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 ... を実行し、その後は同じクエリを使用します。
いいねを押す +0
P粉155832941

###これを試して:### リーリー

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート