Cree una tabla temporal en MySQL con un índice de una selección

82

Tengo una función almacenada donde uso tablas temporales. Por razones de rendimiento, necesito un índice en esa tabla. Desafortunadamente, no puedo usar ALTER TABLEporque esto causa una confirmación implícita.

Por lo tanto estoy buscando la sintaxis para añadir el INDEXde tempiddurante la creación. ¿Alguien puede ser de ayuda?

CREATE TEMPORARY TABLE tmpLivecheck 
(
    tmpid INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY
)
SELECT *
FROM   tblLivecheck_copy
WHERE  tblLivecheck_copy.devId = did;
solick
fuente

Respuestas:

224

Luché bastante con la sintaxis adecuada para CREATE TEMPORARY TABLE SELECT. Habiendo descubierto algunas cosas, quería compartir las respuestas con el resto de la comunidad.

La información básica sobre la declaración está disponible en los siguientes enlaces de MySQL:

CREAR TABLA SELECCIONAR y CREAR TABLA .

A veces puede resultar abrumador interpretar la especificación. Dado que la mayoría de las personas aprenden mejor de los ejemplos, compartiré cómo he creado una declaración funcional y cómo puede modificarla para que funcione para usted.

  1. Agregar varios índices

    Esta declaración muestra cómo agregar varios índices (tenga en cuenta que los nombres de índice, en minúsculas, son opcionales):

    CREATE TEMPORARY TABLE core.my_tmp_table 
    (INDEX my_index_name (tag, time), UNIQUE my_unique_index_name (order_number))
    SELECT * FROM core.my_big_table
    WHERE my_val = 1
    
  2. Agregue una nueva clave primaria :

    CREATE TEMPORARY TABLE core.my_tmp_table 
    (PRIMARY KEY my_pkey (order_number),
    INDEX cmpd_key (user_id, time))
    SELECT * FROM core.my_big_table
    
  3. Crea columnas adicionales

    Puede crear una nueva tabla con más columnas de las que se especifican en la instrucción SELECT. Especifique la columna adicional en la definición de la tabla. Las columnas especificadas en la definición de la tabla y que no se encuentran en select serán las primeras columnas de la nueva tabla, seguidas de las columnas insertadas por la instrucción SELECT.

    CREATE TEMPORARY TABLE core.my_tmp_table 
    (my_new_id BIGINT NOT NULL AUTO_INCREMENT,  
    PRIMARY KEY my_pkey (my_new_id), INDEX my_unique_index_name (invoice_number))
    SELECT * FROM core.my_big_table
    
  4. Redefiniendo tipos de datos para las columnas de SELECT

    Puede redefinir el tipo de datos de una columna que se selecciona. En el ejemplo siguiente, la etiqueta de columna es MEDIUMINT en core.my_big_table y la estoy redefiniendo a BIGINT en core.my_tmp_table.

    CREATE TEMPORARY TABLE core.my_tmp_table 
    (tag BIGINT,
    my_time DATETIME,  
    INDEX my_unique_index_name (tag) )
    SELECT * FROM core.my_big_table
    
  5. Definiciones de campo avanzadas durante la creación

    Todas las definiciones de columna habituales están disponibles como cuando crea una tabla normal. Ejemplo:

    CREATE TEMPORARY TABLE core.my_tmp_table 
    (id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    value BIGINT UNSIGNED NOT NULL DEFAULT 0 UNIQUE,
    location VARCHAR(20) DEFAULT "NEEDS TO BE SET",
    country CHAR(2) DEFAULT "XX" COMMENT "Two-letter country code",  
    INDEX my_index_name (location))
    ENGINE=MyISAM 
    SELECT * FROM core.my_big_table
    
IvanD
fuente
6
Me alegraste el día, ¡esto fue realmente útil!
BastiaanWW
7
A riesgo de sonar como un comentario de "gracias" inútil, quiero que sepas que salvaste mi botín. Ojalá tuviera más para dar que solo un voto a favor. Las tablas temporales con índices se pueden unir para evitar la limitación de unir una tabla temporal a sí misma, y ​​parece que en mi caso el índice era esencial.
Plasmarob
13

Encontré la respuesta por mi cuenta. Mi problema fue que utilizo dos tablas temporales para una combinación y creo la segunda a partir de la primera. Pero el índice no se copió durante la creación ...

CREATE TEMPORARY TABLE tmpLivecheck (tmpid INTEGER NOT NULL AUTO_INCREMENT, PRIMARY    
KEY(tmpid), INDEX(tmpid))
SELECT * FROM tblLivecheck_copy WHERE tblLivecheck_copy.devId = did;

CREATE TEMPORARY TABLE tmpLiveCheck2 (tmpid INTEGER NOT NULL, PRIMARY KEY(tmpid), 
INDEX(tmpid))  
SELECT * FROM tmpLivecheck;

... resolvió mi problema.

Saludos...

solick
fuente
5
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
[(create_definition,...)]
[table_options]
select_statement

Ejemplo:

CREATE TEMPORARY TABLE IF NOT EXISTS mytable
(id int(11) NOT NULL, PRIMARY KEY (id)) ENGINE=MyISAM;
INSERT IGNORE INTO mytable SELECT id FROM table WHERE xyz;
Ayush Bilala
fuente
@solick PRIMARY KEYsiempre está indexado.
ebyrob