générer rapidement la table auxiliaire numérique

        table auxiliaire numérique est seulement une colonne entière contenant les nombres entiers de 1 à des valeurs de séquence N, N est généralement très grand. MySQL en termes de table auxiliaire numérique est un outil puissant, souvent faire la fiche technique du produit cartésien et table auxiliaire numérique lors de l'écriture des instructions SQL pour créer des lignes supplémentaires. Il recommande la création d'une table auxiliaire de données persistantes et remplir la valeur d'une certaine quantité de données au besoin. En fait comment remplir la table auxiliaire numérique n'a pas d'importance, car seulement besoin de courir à nouveau ce processus, mais peut encore être optimisé pour ce processus. Supposons que vous souhaitez générer des données numériques en tant que table auxiliaire:

create table nums (a bigint unsigned not null primary key) engine=innodb;

Première option: ordinaire inefficace

drop procedure if exists pcreatenums;
delimiter //
create procedure pcreatenums(cnt bigint)
begin
    declare s int default 1;
    set session autocommit=0;
    while s<=cnt do
        insert into nums values(s);
        set s=s+1;
    end while;
    commit;
end;
//

        Cette procédure stockée est pas très simple, est un cycle, chacune des données insérées, le nombre de lignes de données générées par le nombre de cycles. Dans mon environnement pour effectuer ce processus génère un million de lignes doivent effectuer près de 1 minute 24 secondes. La raison en est que l'efficacité n'est pas déclaration élevée d'insertion est exécuté 1.000.000.
 

mysql> call pcreatenums(1000000);
Query OK, 0 rows affected (1 min 24.39 sec)

Méthode Deux: itérative efficace

drop procedure if exists pcreatenums;
delimiter //
create procedure pcreatenums(cnt int)
begin
    declare s int default 1;
    set session autocommit=0;
    insert into nums select s;
    while s<=cnt do
        insert into nums select a+s from nums where a+s <=cnt;
        set s=s*2;
    end while;
    commit;
end;
//

        L'exécution a moins de moins de 17 secondes.

mysql> call pcreatenums(1000000);
Query OK, 0 rows affected (16.53 sec)

        Dans ce processus de stockage, la variable s pour enregistrer le nombre de lignes dans la table nums insérée. A partir de la boucle à une insertion de données, et lorsque s est égal au nombre de lignes est inférieur au cycle d'exécution à générer. Dans chaque itération, le processus des valeurs de courant de toutes les tables des lignes nums s + est inséré avant table nums. Ainsi, le nombre de lignes dans le cycle d'insertion d'une puissance de 2 incréments, insert instruction est exécutée seulement 21 fois, qui comprend en outre en tant que premières données de graine une fois insérée. Par conséquent, la vitesse d'exécution de ce processus bientôt.

Troisième méthode: la première génération

set session cte_max_recursion_depth=1000000;
insert into nums 
with recursive temp (n) as (select 1 union all select n+1 from temp where n < 1000000) select n from temp;

        Cette méthode utilise la fonction CTE (Common Table Expressions) fournies par MySQL 8, l'ensemble des données générées de manière récursive à usage unique, prend moins de 13 secondes, la performance est en outre amélioré trimestre.

mysql> insert into nums 
    -> with recursive temp (n) as (select 1 union all select n+1 from temp where n < 1000000) select n from temp;
Query OK, 1000000 rows affected (12.28 sec)
Records: 1000000  Duplicates: 0  Warnings: 0

        CTE peut atteindre similaire dans Oracle connexion par fonction récursive, mais plus puissant, capable de résoudre des enquêtes très complexes. https://dev.mysql.com/doc/refman/8.0/en/with.html est la documentation officielle MySQL du CTE.

Publié 370 articles originaux · a gagné les éloges 599 · Vues 2,18 millions +

Je suppose que tu aimes

Origine blog.csdn.net/wzy0623/article/details/97891073
conseillé
Classement