generar rápidamente mesa auxiliar digitales

        mesa auxiliar Digital es solamente una columna entero que contiene los números enteros de 1 a N valores de secuencia, N es normalmente muy grande. MySQL en términos de la tabla auxiliar digital es una herramienta poderosa, a menudo hacer la hoja de datos del producto cartesiano y mesa auxiliar digitales al escribir sentencias SQL para crear líneas adicionales. Se recomienda la creación de una mesa auxiliar de datos persistente, y rellenar el valor de una cierta cantidad de datos según sea necesario. De hecho cómo rellenar la tabla auxiliar digital no importa, ya que sólo es necesario ejecutar este proceso de nuevo, pero todavía puede ser optimizado para este proceso. Suponga que desea generar datos digitales como mesa auxiliar:

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

Opción uno: ordinaria ineficiente

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;
//

        Este procedimiento almacenado no es muy simple, es un ciclo, cada uno datos insertados, el número de filas de datos generados como el número de ciclos. En mi entorno para llevar a cabo este proceso genera un millón de líneas necesitan para llevar a cabo cerca de 1 minuto 24 segundos. La razón es que la eficiencia no es la declaración de alto inserción se ejecuta 1.000.000.
 

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

Segundo método: iterativo eficiente

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;
//

        La ejecución se llevó a menos de menos de 17 segundos.

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

        En este proceso de almacenamiento, la variable S para guardar el número de filas de la tabla insertada nums. A partir del bucle a una inserción de datos, y cuando s es igual al número de filas es menor que el ciclo de ejecución que se genere. En cada iteración, el proceso de los valores actuales de toda la tabla de nums fila más s se inserta antes tabla nums. Así, el número de filas en el ciclo de inserción de un poder de incrementos de 2, insertar declaración se ejecuta solamente 21 veces, lo que comprende, además, como una primera de datos semilla una vez insertado. Por lo tanto, la velocidad de ejecución de este proceso pronto.

Método tres: la primera generación

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;

        Este método utiliza la función CTE (expresiones de tabla comunes) proporcionado por MySQL 8, todos los datos generados de forma recursiva desechable, toma menos de 13 segundos, el rendimiento es aún más trimestre mejorada.

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 puede lograr similar en Oracle conexión por función recursiva, pero más potente, capaz de resolver consultas muy complejas. https://dev.mysql.com/doc/refman/8.0/en/with.html es MySQL documentación oficial de la CTE.

Publicados 370 artículos originales · ganado elogios 599 · Vistas 2,18 millones +

Supongo que te gusta

Origin blog.csdn.net/wzy0623/article/details/97891073
Recomendado
Clasificación