„Filtern' Sie riesige MariaDB/Mysql-Tabellen basierend auf verschiedenen Tabellen
P粉287345251
P粉287345251 2023-09-07 10:51:26
0
2
596

Arbeiten mit großen Datensätzen in meiner mariaDB-Datenbank. Ich habe zwei Tabellen, Tabelle A enthält 57 Millionen Zeilen und Tabelle B enthält etwa 500 Zeilen. Tabelle B ist eine Teilmenge von IDs, die sich auf Spalten in Tabelle A beziehen. Ich möchte alle Zeilen in A, Tabelle B löschen.

Beispieltabelle A:

classification_id Name
20 Mercedes
30 Kawasaki
80 Leitz
70 HP

Beispieltabelle B:

classification_id Typ
20 Autos
30 Fahrrad
40 Bus
50 Boot

In diesem Beispiel werden also die letzten beiden Zeilen in Tabelle A gelöscht (oder es wird eine gespiegelte Tabelle erstellt, die nur die ersten beiden Zeilen enthält, was auch funktioniert).

Ich habe versucht, die zweite Abfrage mit Inner Join auszuführen, aber diese Abfrage dauerte einige Minuten, bevor eine Ausnahme wegen nicht genügend Arbeitsspeicher ausgegeben wurde.

Irgendwelche Vorschläge zur Lösung dieses Problems?

P粉287345251
P粉287345251

Antworte allen(2)
P粉258083432

由于您说过滤表包含相对较少的行数,因此最好的选择是创建一个单独的表,其中包含与原始表 A 相同的列以及与您的匹配的行criteria,然后替换原始表并删除它。另外,对于如此数量的 ID,您可能希望使用 WHERE IN () 而不是联接 - 只要您在那里使用的字段已建立索引,它通常会方式 em> 更快。将所有内容放在一起:

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;

需要注意的事项:

  • 备份您的数据!并在运行 DROP TABLE 之前彻底测试查询。您不想因为 StackOverflow 上的随机答案而丢失 57M 行数据。
  • 如果 A 有任何索引或外键,这些将不会被复制 - 因此您必须手动重新创建它们。我建议首先运行 SHOW CREATE TABLE A 并记下其结构。或者,您可以考虑使用 SHOW CREATE TABLE A 的输出作为模板显式创建表 new_A,然后执行 INSERT INTO new_A SELECT ... code> 而不是 CREATE TABLE new_A AS SELECT ... 并在此之后使用相同的查询。
P粉155832941

试试这个:

delete from "table A" where classification_id not in (select classification_id from "table B");
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage