Maison > Questions et réponses > le corps du texte
Travailler avec de grands ensembles de données dans ma base de données mariaDB. J'ai deux tables, la table A contient 57 millions de lignes et la table B contient environ 500 lignes. Le tableau B est un sous-ensemble d'identifiants liés aux colonnes du tableau A. Je souhaite supprimer toutes les lignes du tableau A B.
Exemple de tableau A :
classification_id | Nom |
---|---|
20 | Mercedes |
30 | Kawasaki |
80 | Leitz |
70 | HP |
Exemple de tableau B :
classification_id | Type |
---|---|
20 | Voitures |
30 | Vélo |
40 | Bus |
50 | Bateau |
Donc, dans cet exemple, les deux dernières lignes du tableau A seront supprimées (ou un tableau miroir sera créé contenant uniquement les deux premières lignes, ce qui fonctionnera également).
J'ai essayé d'exécuter la deuxième requête en utilisant la jointure interne, mais cette requête a pris quelques minutes avant de donner une exception de mémoire insuffisante.
Des suggestions sur la façon de résoudre ce problème ?
P粉2580834322023-09-08 09:32:15
Puisque vous dites que la table filtrée contient un nombre relativement petit de lignes, votre meilleure option est de créer une table séparée avec la table d'origine A
相同的列以及与您的匹配的行criteria,然后替换原始表并删除它。另外,对于如此数量的 ID,您可能希望使用 WHERE IN ()
plutôt qu'une jointure - tant que les champs que vous utilisez sont indexés, ce sera généralement le cas Le way em> est plus rapide. Rassembler le tout :
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;
À noter :
A
有任何索引或外键,这些将不会被复制 - 因此您必须手动重新创建它们。我建议首先运行 SHOW CREATE TABLE A
并记下其结构。或者,您可以考虑使用 SHOW CREATE TABLE A
的输出作为模板显式创建表 new_A
,然后执行 INSERT INTO new_A SELECT ... code> 而不是 CREATE TABLE new_A AS SELECT ...
et utilisez la même requête après cela.
P粉1558329412023-09-08 00:49:06
Essayez ceci :
delete from "table A" where classification_id not in (select classification_id from "table B");