recherche

Maison  >  Questions et réponses  >  le corps du texte

"Filtrer" d'énormes tables MariaDB/Mysql basées sur différentes tables

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粉287345251P粉287345251486 Il y a quelques jours609

répondre à tous(2)je répondrai

  • P粉258083432

    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 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 :

    • Sauvegardez vos données ! Et testez minutieusement la requête avant d’exécuter DROP TABLE. Vous ne voulez pas perdre 57 millions de lignes de données à cause de réponses aléatoires sur StackOverflow.
    • if A 有任何索引或外键,这些将不会被复制 - 因此您必须手动重新创建它们。我建议首先运行 SHOW CREATE TABLE A 并记下其结构。或者,您可以考虑使用 SHOW CREATE TABLE A 的输出作为模板显式创建表 new_A,然后执行 INSERT INTO new_A SELECT ... 而不是 CREATE TABLE new_A AS SELECT ... et utilisez la même requête après cela.

    répondre
    0
  • P粉155832941

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

    Essayez ceci :

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

    répondre
    0
  • Annulerrépondre