ホームページ  >  に質問  >  本文

異なるテーブルに基づいて巨大な MariaDB/Mysql テーブルを「フィルタリング」する

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粉287345251P粉287345251377日前468

全員に返信(2)返信します

  • P粉258083432

    P粉2580834322023-09-08 09:32:15

    フィルター処理されたテーブルに含まれる行数が比較的少ないとのことなので、元のテーブル A と同じ列と条件に一致する行を含む別のテーブルを作成し、その行を置き換えるのが最善の選択肢です。元のテーブルを削除してください。また、この ID 数では、結合の代わりに WHERE IN () を使用することもできます。そこで使用するフィールドにインデックスが付けられている限り、通常は way になります。もっと早く。すべてを一緒に入れて: ### リーリー

    注意事項:

      データをバックアップしてください!また、DROP TABLE を実行する前にクエリを徹底的にテストします。 StackOverflow でのランダムな応答によって 5,700 万行のデータが失われることは望ましくありません。
    • A にインデックスまたは外部キーがある場合、これらはコピーされないため、手動で再作成する必要があります。最初に SHOW CREATE TABLE A を実行し、その構造をメモしておくことをお勧めします。あるいは、SHOW CREATE TABLE A の出力をテンプレートとして使用してテーブル new_A を明示的に作成し、代わりに INSERT INTO new_A SELECT ... を実行することを検討することもできます。 CREATE TABLE new_A AS SELECT ... を実行し、その後は同じクエリを使用します。
    • 返事
      0
  • P粉155832941

    P粉1558329412023-09-08 00:49:06

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

    返事
    0
  • キャンセル返事