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?
由于您说过滤表包含相对较少的行数,因此最好的选择是创建一个单独的表,其中包含与原始表
A
相同的列以及与您的匹配的行criteria,然后替换原始表并删除它。另外,对于如此数量的 ID,您可能希望使用WHERE IN ()
而不是联接 - 只要您在那里使用的字段已建立索引,它通常会方式 em> 更快。将所有内容放在一起:需要注意的事项:
A
有任何索引或外键,这些将不会被复制 - 因此您必须手动重新创建它们。我建议首先运行SHOW CREATE TABLE A
并记下其结构。或者,您可以考虑使用SHOW CREATE TABLE A
的输出作为模板显式创建表new_A
,然后执行INSERT INTO new_A SELECT ... code> 而不是
CREATE TABLE new_A AS SELECT ...
并在此之后使用相同的查询。试试这个: