cari

Rumah  >  Soal Jawab  >  teks badan

"Tapis" jadual MariaDB/Mysql yang besar berdasarkan jadual yang berbeza

Bekerja dengan set data yang besar dalam pangkalan data mariaDB saya. Saya mempunyai dua jadual, Jadual A mengandungi 57 juta baris dan Jadual B mengandungi kira-kira 500 baris. Jadual B ialah subset id yang berkaitan dengan lajur dalam Jadual A. Saya mahu memadamkan semua baris dalam A jadual B.

Contoh Jadual A:

classification_id Nama
20 Mercedes
30 Kawasaki
80 Leitz
70 HP

Contoh Jadual B:

classification_id Taip
20 Kereta
30 Basikal
40 Bas
50 Boat

Jadi dalam contoh ini, dua baris terakhir dalam jadual A akan dipadamkan (atau jadual bercermin akan dibuat hanya mengandungi dua baris pertama, yang juga akan berfungsi).

Saya cuba melaksanakan pertanyaan kedua menggunakan inner join tetapi pertanyaan ini mengambil masa beberapa minit sebelum memberikan pengecualian memori.

Ada cadangan bagaimana untuk menyelesaikan masalah ini?

P粉287345251P粉287345251440 hari yang lalu581

membalas semua(2)saya akan balas

  • P粉258083432

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

    Memandangkan anda mengatakan jadual yang ditapis mengandungi bilangan baris yang agak kecil, pilihan terbaik anda ialah membuat jadual berasingan dengan jadual asal A 相同的列以及与您的匹配的行criteria,然后替换原始表并删除它。另外,对于如此数量的 ID,您可能希望使用 WHERE IN () dan bukannya gabungan - selagi medan yang anda gunakan di sana diindeks, ia biasanya akan cara lebih pantas. Menyatukan semuanya:

    CREATE TABLE new_A AS
      SELECT A.* FROM A 
      WHERE classification_id IN (SELECT classification_id FROM B);
    RENAME TABLE A TO old_A, new_A to A;
    DROP TABLE old_A;

    Perkara yang perlu diambil perhatian:

    • Sandarkan data anda! Dan uji pertanyaan dengan teliti sebelum menjalankan DROP TABLE. Anda tidak mahu kehilangan 57 juta baris data kerana jawapan rawak pada StackOverflow.
    • jika A 有任何索引或外键,这些将不会被复制 - 因此您必须手动重新创建它们。我建议首先运行 SHOW CREATE TABLE A 并记下其结构。或者,您可以考虑使用 SHOW CREATE TABLE A 的输出作为模板显式创建表 new_A,然后执行 INSERT INTO new_A SELECT ... 而不是 CREATE TABLE new_A AS SELECT ... dan gunakan pertanyaan yang sama selepas itu.

    balas
    0
  • P粉155832941

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

    Cuba ini:

    delete from "table A" where classification_id not in (select classification_id from "table B");

    balas
    0
  • Batalbalas