"Tapis" jadual MariaDB/Mysql yang besar berdasarkan jadual yang berbeza
P粉287345251
P粉287345251 2023-09-07 10:51:26
0
2
577

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粉287345251
P粉287345251

membalas semua(2)
P粉258083432

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 em> 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 ... code> 而不是 CREATE TABLE new_A AS SELECT ... dan gunakan pertanyaan yang sama selepas itu.
P粉155832941

Cuba ini:

delete from "table A" where classification_id not in (select classification_id from "table B");
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan