Tabelle temporanee MySQL: come funzionano, vantaggi e migliori pratiche

目次

1. Introduzione

Quando si lavora con MySQL, una “tabella temporanea” è un modo utile per memorizzare e elaborare i dati temporaneamente. Utilizzando le tabelle temporanee, è possibile tenere i dati in sospeso per ridurre il carico di query complesse e migliorare l’efficienza dell’elaborazione batch.

In questo articolo spiegheremo cosa sono le tabelle temporanee di MySQL, insieme ai loro casi d’uso e ai vantaggi in dettaglio.

Che cos’è una tabella temporanea?

Una tabella temporanea è una tabella valida solo all’interno di una sessione.
A differenza delle tabelle regolari, non è memorizzata in modo permanente nel database e viene eliminata automaticamente al termine della sessione.

Le caratteristiche principali delle tabelle temporanee sono le seguenti:

  • Esistono per sessione (non accessibili da altre connessioni)
  • Vengono eliminate automaticamente al termine della sessione
  • Possono essere usate senza interferire anche se esiste una tabella regolare con lo stesso nome
  • Sono spesso utilizzate per migliorare le prestazioni

Le tabelle temporanee sono adatte per l’analisi dei dati e l’elaborazione temporanea, e sono comunemente usate come supporto per l’elaborazione batch e le attività di aggregazione.

Vantaggi dell’uso delle tabelle temporanee

L’uso delle tabelle temporanee può rendere l’elaborazione dei dati più efficiente. Ecco tre vantaggi principali.

1. Migliorare le prestazioni delle query

Quando si gestiscono grandi quantità di dati, l’uso di più JOIN e sottoquery può rendere l’elaborazione complessa e aumentare il carico del database. Con le tabelle temporanee è possibile filtrare e memorizzare i dati in anticipo, accelerando l’esecuzione delle query.

2. Ideale per l’archiviazione temporanea dei dati

Nell’elaborazione batch o nella trasformazione dei dati, può essere necessario memorizzare i dati temporaneamente ed eseguire le operazioni necessarie. Le tabelle temporanee consentono di conservare i dati temporaneamente e permettono un’elaborazione veloce in memoria.

3. Mantenere al sicuro i dati esistenti

Manipolare direttamente i dati di produzione è rischioso. Utilizzando le tabelle temporanee, è possibile elaborare i dati senza modificare quelli di produzione e ridurre il rischio di errori.

Riepilogo

Le tabelle temporanee di MySQL sono uno strumento comodo per l’archiviazione e l’elaborazione temporanea dei dati.

  • Sono limitate alla sessione e vengono eliminate al termine della sessione
  • Sono utili per migliorare le prestazioni e per l’elaborazione batch
  • Permettono operazioni sicure senza modificare i dati di produzione

2. Nozioni di base sulle tabelle temporanee

Le tabelle temporanee di MySQL sono usate per memorizzare i dati temporaneamente, a differenza delle tabelle regolari. In questa sezione spiegheremo i concetti di base delle tabelle temporanee in dettaglio, includendo le “differenze rispetto alle tabelle regolari” e le “differenze rispetto alle tabelle temporanee interne”.

Differenze tra tabelle temporanee e tabelle regolari

Le tabelle temporanee e le tabelle regolari differiscono notevolmente in riguardo alla conservazione dei dati e al comportamento di accesso. La tabella seguente riassume le principali differenze.

ItemTemporary TableRegular Table
LifetimeDropped when the session endsExists until explicitly dropped
AccessAvailable only within the session (not visible to other connections)Shareable across all sessions
ConflictsCan be used even if a regular table with the same name existsCannot create another table with the same name
Storage locationMEMORY (default) or an InnoDB temporary areaStored in the database storage
PersistenceNone (dropped when the session ends)Yes (retained by the database)

Punti chiave

  • Le tabelle temporanee sono isolati per sessione e non sono visibili ad altri utenti.
  • È possibile crearle senza errori anche se esiste una tabella regolare con lo stesso nome.
  • Vengono create esplicitamente usando CREATE TEMPORARY TABLE e sono eliminate automaticamente al termine della sessione.

Differenze tra tabelle temporanee e tabelle temporanee interne

Oltre alle tabelle temporanee create dall’utente, MySQL crea anche tabelle temporanee interne in modo automatico. Possono sembrare simili, ma i loro scopi e la loro gestione differiscono.

ItemTemporary TableInternal Temporary Table
Creation methodExplicitly created using CREATE TEMPORARY TABLEAutomatically created by MySQL
PurposeCreated by the user for specific processingCreated by MySQL to process complex queries (GROUP BY, ORDER BY)
ScopeAvailable only within the sessionValid only while the query is executing
DeletionDropped when the session endsAutomatically dropped after the query completes

Che cos’è una tabella temporanea interna?

  • MySQL può creare internamente tabelle temporanee per ottimizzare alcune query (come GROUP BY, ORDER BY, DISTINCT).
  • Gli utenti finali non possono gestirle direttamente (non è possibile crearle esplicitamente con CREATE TEMPORARY TABLE).
  • Vengono create secondo necessità durante l’esecuzione della query e sono eliminate automaticamente al completamento della query.

Esempio che può generare tabelle temporanee interne

Quando esegui una query come la seguente, MySQL può creare una tabella temporanea interna per elaborarla.

SELECT category, COUNT(*) 
FROM products 
GROUP BY category
ORDER BY COUNT(*) DESC;

In questo caso, MySQL può creare una tabella temporanea interna per memorizzare temporaneamente i risultati del GROUP BY,
e poi usarla per calcolare l’output finale.

Riepilogo

  • Una tabella temporanea è una tabella temporanea creata dall’utente che viene eliminata automaticamente al termine della sessione.
  • A differenza delle tabelle regolari, non può essere accessibile da altre sessioni .
  • Una tabella temporanea interna è creata ed eliminata automaticamente da MySQL , e gli utenti non possono controllarla direttamente.

3. Come creare tabelle temporanee

È possibile creare una tabella temporanea MySQL utilizzando l’istruzione CREATE TEMPORARY TABLE. In questa sezione, spieghiamo tutto, dalla creazione di base alla creazione di una tabella basata su una tabella esistente.

Metodo base per creare una tabella temporanea

In MySQL, si utilizza CREATE TEMPORARY TABLE per creare una tabella temporanea.

Sintassi di base

CREATE TEMPORARY TABLE table_name (
    column_name data_type constraints,
    column_name data_type constraints,
    ...
);

Esempio di codice

Il seguente SQL crea una tabella temporanea chiamata users_temp con tre colonne: id (intero), name (stringa) e email (stringa).

CREATE TEMPORARY TABLE users_temp (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    email VARCHAR(100)
);

Poiché questa tabella viene eliminata automaticamente al termine della sessione, non influisce sul database persistente.

Creare una tabella temporanea basata su una tabella esistente

Invece di creare una tabella temporanea da zero, è anche possibile copiare la struttura di una tabella esistente per crearne una.

Utilizzando CREATE TEMPORARY TABLE ... SELECT

In MySQL, è possibile creare una tabella temporanea basata sul risultato di un’istruzione SELECT.

Sintassi di base

CREATE TEMPORARY TABLE temp_table_name
SELECT * FROM existing_table_name;

Esempio di codice

Ad esempio, per copiare la struttura dei dati della tabella users e creare una nuova tabella temporanea users_temp, è possibile scrivere:

CREATE TEMPORARY TABLE users_temp
SELECT * FROM users;

Con questo metodo, la struttura delle colonne di users viene trasferita a users_temp, ma vincoli come PRIMARY KEY e INDEX non vengono copiati.

Se si desidera copiare solo la struttura della tabella senza includere i dati, aggiungere WHERE 1=0.

CREATE TEMPORARY TABLE users_temp
SELECT * FROM users WHERE 1=0;

Con questo SQL, le definizioni delle colonne di users vengono copiate, ma non vengono inclusi dati.

Note sulla creazione di tabelle temporanee

1. Le tabelle temporanee sono limitate alla sessione

  • Una tabella temporanea è valida solo all’interno della sessione in cui è stata creata.
  • Non può essere accessibile da altre connessioni o da altri utenti.

2. È possibile crearla anche se esiste una tabella regolare con lo stesso nome

  • Ad esempio, anche se nel database esiste una tabella regolare chiamata users, è possibile creare una tabella temporanea chiamata users .
  • In quella sessione, la tabella temporanea ha la precedenza e la tabella regolare diventa nascosta.

3. Impatto del motore di archiviazione

  • Per impostazione predefinita, le tabelle temporanee utilizzano il motore MEMORY, ma se la dimensione dei dati è grande, possono essere memorizzate in un’area temporanea InnoDB.
  • Se si desidera specificare esplicitamente il motore MEMORY, scriverlo così: CREATE TEMPORARY TABLE users_temp ( id INT PRIMARY KEY, name VARCHAR(50), email VARCHAR(100) ) ENGINE=MEMORY;
  • Il motore MEMORY è veloce ma ha limiti di dimensione dei dati. Per grandi set di dati, considerare l’uso di InnoDB.

Riepilogo

  • Creare tabelle temporanee usando CREATE TEMPORARY TABLE.
  • È anche possibile crearne una copiando una tabella esistente (SELECT * FROM).
  • Il motore MEMORY può essere veloce, ma InnoDB è spesso migliore per grandi set di dati.
  • Le tabelle temporanee sono gestite per sessione e sono eliminate automaticamente al termine della sessione.

4. Come utilizzare le tabelle temporanee

Le tabelle temporanee di MySQL possono essere utilizzate come tabelle normali, includendo INSERT, UPDATE, DELETE e SELECT. In questa sezione spieghiamo ogni operazione in dettaglio.

Inserimento di dati

Per aggiungere dati a una tabella temporanea, utilizza l’istruzione regolare INSERT INTO.

Sintassi di base

INSERT INTO temp_table_name (column1, column2, ...)
VALUES (value1, value2, ...);

Esempio di codice

Il seguente SQL inserisce dati in una tabella temporanea denominata users_temp.

INSERT INTO users_temp (id, name, email)
VALUES (1, 'Taro Yamada', 'taro@example.com');

Puoi anche copiare e inserire dati da una tabella esistente.

INSERT INTO users_temp (id, name, email)
SELECT id, name, email FROM users WHERE age >= 18;

Questo SQL inserisce dati per utenti di età pari o superiore a 18 anni dalla tabella users nella tabella temporanea.

Aggiornamento di dati

Per modificare i dati in una tabella temporanea, utilizza l’istruzione regolare UPDATE.

Sintassi di base

UPDATE temp_table_name
SET column_name = new_value
WHERE condition;

Esempio di codice

Ad esempio, per cambiare il nome dell’utente con id=1 nella tabella users_temp:

UPDATE users_temp
SET name = 'Ichiro Sato'
WHERE id = 1;

Eliminazione di dati

Per eliminare dati non necessari, utilizza l’istruzione DELETE.

Sintassi di base

DELETE FROM temp_table_name WHERE condition;

Esempio di codice

Ad esempio, per eliminare la riga con id=1 da users_temp:

DELETE FROM users_temp WHERE id = 1;

Per eliminare tutti i dati nella tabella, ometti la clausola WHERE.

DELETE FROM users_temp;

Nota che l’uso di DELETE non elimina la tabella stessa; elimina solo i dati.

Selezione di dati

Per recuperare i dati memorizzati in una tabella temporanea, utilizza l’istruzione SELECT.

Sintassi di base

SELECT column_name FROM temp_table_name WHERE condition;

Esempio di codice

Ad esempio, per recuperare tutti i dati da users_temp:

SELECT * FROM users_temp;

Per recuperare dati che corrispondono a una condizione specifica, utilizza la clausola WHERE.

SELECT * FROM users_temp WHERE email LIKE '%@example.com';

Questo SQL recupera solo le righe in cui l’indirizzo email contiene @example.com.

Note sull’uso delle tabelle temporanee

1. I dati vengono rimossi al termine della sessione

  • Le tabelle temporanee sono gestite per sessione, e i loro dati vengono anch’essi rimossi al termine della sessione.
  • Per processi a lunga durata, è consigliato eseguire backup periodici dei dati.

2. Creare una tabella temporanea con lo stesso nome genera un errore

  • Se provi a creare una tabella temporanea con lo stesso nome usando CREATE TEMPORARY TABLE, si verifica un errore.
  • Come approccio per evitare errori, esegui prima DROP TEMPORARY TABLE IF EXISTS. DROP TEMPORARY TABLE IF EXISTS users_temp; CREATE TEMPORARY TABLE users_temp (...);

3. Vincoli del motore di archiviazione

  • Le tabelle temporanee usano di default il motore MEMORY, ma set di dati di grandi dimensioni possono essere automaticamente memorizzati in un’area temporanea InnoDB.
  • Per set di dati di grandi dimensioni, è consigliato utilizzare una tabella temporanea InnoDB.

Riepilogo

  • Le tabelle temporanee possono eseguire INSERT, UPDATE, DELETE e SELECT proprio come le tabelle normali.
  • Quando la sessione termina, i dati nella tabella temporanea vengono anch’essi rimossi automaticamente.
  • Eseguire DROP TEMPORARY TABLE IF EXISTS in anticipo aiuta a evitare errori di conflitto di nome.
  • Per set di dati di grandi dimensioni, è consigliato utilizzare una tabella temporanea InnoDB.

5. Gestione ed Eliminazione delle Tabelle Temporanee

Le tabelle temporanee di MySQL vengono eliminate automaticamente al termine della sessione. Tuttavia, in alcuni casi potresti doverle eliminare esplicitamente. In questa sezione spieghiamo come gestire ed eliminare le tabelle temporanee.

Come eliminare una tabella temporanea

Per eliminare esplicitamente una tabella temporanea, utilizza l’istruzione DROP TEMPORARY TABLE.

Sintassi di base

DROP TEMPORARY TABLE table_name;

Esempio di codice

Ad esempio, per eliminare una tabella temporanea chiamata users_temp, esegui:

DROP TEMPORARY TABLE users_temp;

Dopo aver eseguito questo SQL, la tabella users_temp viene rimossa e non può più essere utilizzata nella sessione.

Eliminazione automatica alla fine della sessione

Una tabella temporanea viene eliminata automaticamente quando termina la sessione.

Come funziona l’eliminazione automatica

  1. Crea una tabella temporanea con CREATE TEMPORARY TABLE
  2. Opera sui suoi dati mentre la sessione è attiva
  3. Quando la sessione (connessione) viene chiusa, la tabella temporanea viene eliminata automaticamente

Tuttavia, fai attenzione nei seguenti casi:

  • Quando le sessioni rimangono aperte per un lungo periodo → Le tabelle temporanee non necessarie possono consumare memoria, quindi è consigliato eseguire DROP TEMPORARY TABLE quando necessario.
  • Quando si gestiscono grandi quantità di dati → Per evitare pressione sullo storage, è importante eliminare le tabelle in modo appropriato.

Utilizzo di DROP TEMPORARY TABLE IF EXISTS

Per evitare errori quando si elimina una tabella che potrebbe non esistere, è possibile utilizzare IF EXISTS.

Sintassi di base

DROP TEMPORARY TABLE IF EXISTS table_name;

Codice di esempio

DROP TEMPORARY TABLE IF EXISTS users_temp;

Questo SQL elimina users_temp se esiste; se non esiste, non genererà un errore.

Errori comuni e soluzioni

Errore 1: “Tabella non trovata”

Quando si verifica:

  • Quando si tenta di eliminare una tabella che non esiste utilizzando DROP TEMPORARY TABLE
  • Poiché le tabelle temporanee sono limitate alla sessione, non è possibile eliminarle da una sessione diversa

Soluzione:

  • Aggiungi IF EXISTS per evitare l’errore
    DROP TEMPORARY TABLE IF EXISTS users_temp;
    
  • Elimina all’interno della sessione corretta

Errore 2: “Tabella già esistente”

Quando si verifica:

  • Quando si tenta di creare una tabella temporanea con un nome che esiste già

Soluzione:

  • Esegui DROP TEMPORARY TABLE IF EXISTS in anticipo
    DROP TEMPORARY TABLE IF EXISTS users_temp;
    CREATE TEMPORARY TABLE users_temp (
        id INT PRIMARY KEY,
        name VARCHAR(50),
        email VARCHAR(100)
    );
    

Migliori pratiche per la gestione delle tabelle temporanee

  1. Eliminale esplicitamente quando non ne hai più bisogno
  • Esegui DROP TEMPORARY TABLE quando necessario per liberare tabelle non necessarie.
  1. Utilizza IF EXISTS per evitare errori
  • DROP TEMPORARY TABLE IF EXISTS previene errori quando si elimina una tabella che non esiste.
  1. Sii consapevole della gestione delle sessioni
  • Le sessioni a lunga durata possono causare il consumo di memoria da parte delle tabelle temporanee, quindi eliminale in modo appropriato.
  1. Comprendi l’impatto del motore di storage
  • Il motore MEMORY è veloce ma ha limiti sulla dimensione dei dati.
  • Se utilizzi InnoDB, devi considerare l’utilizzo dello spazio su disco.

Riepilogo

  • È possibile eliminare esplicitamente le tabelle temporanee utilizzando DROP TEMPORARY TABLE.
  • Vengono eliminate automaticamente quando termina la sessione, ma per sessioni a lunga durata è consigliata una pulizia manuale.
  • DROP TEMPORARY TABLE IF EXISTS aiuta a prevenire errori durante l’eliminazione.
  • È utile sapere come gestire gli errori “Tabella non trovata” e “Tabella già esistente”.

6. Casi d’uso pratici per le tabelle temporanee

Le tabelle temporanee di MySQL vengono utilizzate per rendere più efficiente l’archiviazione e l’elaborazione temporanea dei dati. In questa sezione, introduciamo scenari comuni in cui le tabelle temporanee sono utili e spieghiamo i dettagli di implementazione.

1. Utilizzo come tabella intermedia per l’aggregazione

Nell’analisi dei dati e nella generazione di report, l’elaborazione diretta di grandi dataset può rallentare l’esecuzione delle query. Utilizzando una tabella temporanea, puoi organizzare prima i dati e poi elaborarli, migliorando le prestazioni.

Scenario

  • La tabella sales contiene un anno di dati di vendita.
  • Vuoi calcolare il totale delle vendite mensili e eseguire ulteriori analisi.

Esempio di implementazione

CREATE TEMPORARY TABLE monthly_sales (
    month_year DATE,
    total_sales DECIMAL(10,2)
);

INSERT INTO monthly_sales (month_year, total_sales)
SELECT DATE_FORMAT(sale_date, '%Y-%m-01') AS month_year, SUM(amount) 
FROM sales
GROUP BY month_year;

SELECT * FROM monthly_sales;

2. Keeping temporary data for batch processing

Temporary tables are also useful for batch processing (bulk operations). For example, you can filter data by certain conditions and store only the target data in a temporary table to operate efficiently.

Scenario

  • From the users table, you want to email only users who have logged in within the last year .
  • You store the target data in a temporary table first, then process it sequentially.

Example implementation

CREATE TEMPORARY TABLE active_users (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(255)
);

INSERT INTO active_users
SELECT id, name, email FROM users WHERE last_login >= NOW() - INTERVAL 1 YEAR;

SELECT * FROM active_users;

3. Simplifying complex queries

Running complex queries directly can reduce performance and hurt readability. By using temporary tables, you can reduce subqueries and keep SQL simpler.

Scenario

  • You want to get the top 10 best-selling products from the orders table.
  • You want to avoid using subqueries by leveraging a temporary table.

Example implementation

CREATE TEMPORARY TABLE top_products AS
SELECT product_id, SUM(amount) AS total_sales
FROM orders
GROUP BY product_id
ORDER BY total_sales DESC
LIMIT 10;

SELECT * FROM top_products;

4. Temporary operations without needing rollback

Temporary tables are managed per session and are not affected by transactions. This makes them suitable for managing temporary data where rollback is not desired.

Scenario

  • During a transaction, you want to keep temporary calculation results .
  • But you want to avoid temporary data being rolled back on errors.

Example implementation

START TRANSACTION;

CREATE TEMPORARY TABLE temp_results (
    user_id INT,
    score INT
);

INSERT INTO temp_results
SELECT user_id, SUM(points) FROM game_scores GROUP BY user_id;

-- Conferma la transazione
COMMIT;

SELECT * FROM temp_results;

Summary

  • Temporary tables can be used for aggregation, batch processing, and simplifying queries across many scenarios.
  • Using them as an intermediate table can improve performance and help organize data.
  • For batch processing , pre-extracting only target data helps avoid unnecessary work.
  • For simplifying complex queries , reducing subqueries improves readability.
  • Because they are not affected by transactions , they can be used for temporary data where rollback is not needed.

7. Alternatives and Limitations of Temporary Tables

MySQL temporary tables are useful, but they have some limitations. In some cases, using alternatives such as views or subqueries can provide more efficient data processing. In this section, we explain the main limitations of temporary tables and alternative approaches to work around them.

Main limitations of temporary tables

Temporary tables have several limitations that regular tables do not. Understanding these helps you choose appropriate use cases.

1. Session-scoped

  • A temporary table is valid only within the session where it was created, and cannot be accessed by other connections or users .
  • Even if a regular table with the same name exists, the temporary table takes precedence within the session (the regular table is not accessible).

2. The schema is not retained

  • Regular tables can be inspected with SHOW CREATE TABLE , but a temporary table disappears when the session ends , so its schema is not retained.

3. Index limitations

  • Se non specifichi PRIMARY KEY o INDEX in CREATE TEMPORARY TABLE, non vengono creati automaticamente.
  • Se hai bisogno di indici su una tabella temporanea, devi crearli manualmente.

4. Il motore di archiviazione predefinito è MEMORY

  • Con il motore MEMORY, grandi dimensioni dei dati possono causare lo swapping su disco e ridurre le prestazioni.
  • Se specifichi InnoDB, può gestire dati più grandi, ma l’uso del disco aumenta.

5. Non influenzato dalle transazioni

  • Le tabelle temporanee non sono influenzate da ROLLBACK.
  • Pertanto, non sono adatte a elaborazioni che richiedono una coerenza transazionale rigorosa.

Alternative alle tabelle temporanee

Per evitare queste limitazioni, puoi utilizzare viste o sottoquery al posto delle tabelle temporanee per una gestione dei dati più flessibile.

1. Usa una vista

Una vista può essere usata in modo simile alle tabelle temporanee per riferire dati temporanei. Una vista agisce come una tabella virtuale e non richiede l’archiviazione temporanea dei dati, il che aiuta a evitare vincoli di spazio.

Crea una vista

CREATE VIEW active_users AS
SELECT id, name, email FROM users WHERE last_login >= NOW() - INTERVAL 1 YEAR;

Usa la vista

SELECT * FROM active_users;
Pro dell’utilizzo di una vista

Nessun utilizzo di spazio (i dati sono referenziati direttamente, non è necessario archiviarli temporaneamente)
Non dipendente dalla sessione (disponibile per altri utenti e connessioni)
Lo schema può essere conservato (puoi rivedere la definizione con SHOW CREATE VIEW)

Contro dell’utilizzo di una vista

Difficile da aggiornare (l’INSERT o l’UPDATE diretto su una vista è limitato)
Le prestazioni possono degradarsi con dataset di grandi dimensioni

2. Usa una sottoquery

Puoi anche usare una sottoquery per elaborare dati temporanei senza creare una tabella temporanea.

Utilizzo di una tabella temporanea

CREATE TEMPORARY TABLE top_products AS
SELECT product_id, SUM(amount) AS total_sales
FROM orders
GROUP BY product_id
ORDER BY total_sales DESC
LIMIT 10;

SELECT * FROM top_products;

Utilizzo di una sottoquery

SELECT product_id, SUM(amount) AS total_sales
FROM orders
GROUP BY product_id
ORDER BY total_sales DESC
LIMIT 10;
Pro dell’utilizzo di una sottoquery

Migliori prestazioni perché non crei una tabella temporanea
Nessun utilizzo di spazio
Non dipendente dalla sessione e può essere eseguita in qualsiasi momento

Contro dell’utilizzo di una sottoquery

La leggibilità può risentire con query complesse
Difficile riutilizzare i dati (potresti dover referenziare gli stessi dati più volte)

3. Usa una CTE (clausola WITH)

In MySQL 8.0 e versioni successive, puoi usare una CTE (Common Table Expression) per gestire i dati temporaneamente senza creare una tabella temporanea.

Esempio di CTE

WITH top_products AS (
    SELECT product_id, SUM(amount) AS total_sales
    FROM orders
    GROUP BY product_id
    ORDER BY total_sales DESC
    LIMIT 10
)
SELECT * FROM top_products;
Pro dell’utilizzo di una CTE

Migliora la leggibilità (spesso più facile da leggere rispetto alle sottoquery)
Può ottimizzare le prestazioni (elaborazione in stile temporaneo senza creare una tabella temporanea)

Contro dell’utilizzo di una CTE

Non disponibile in MySQL 5.x (supportata solo in MySQL 8.0 e versioni successive)

Riepilogo

MethodProsCons
Temporary tableGood for session-scoped data processingConsumes storage and disappears when the session ends
ViewNo storage usage, not session-dependentHard to update, possible performance degradation
SubqueryNo storage usage, simpleHard to reuse, reduced readability
CTE (WITH)Better readability, performance optimizationAvailable only in MySQL 8.0+

8. FAQ

Ecco le domande frequenti sulle tabelle temporanee MySQL. Speriamo che questo aiuti a chiarire come si comportano e quali limitazioni hanno.

1. Le tabelle temporanee possono essere referenziate da altre sessioni?

No, non possono.
Una tabella temporanea è disponibile solo nella sessione in cui è stata creata. Altre sessioni non possono accedervi. Anche se un altro utente crea una tabella temporanea con lo stesso nome, ogni sessione la tratta come una tabella indipendente.

2. Quali privilegi sono necessari per creare tabelle temporanee?

Per creare tabelle temporanee, è necessario il privilegio CREATE TEMPORARY TABLES sul database.
Per concedere il privilegio a un utente, eseguire il seguente SQL:

GRANT CREATE TEMPORARY TABLES ON database_name.* TO 'user_name'@'host';

È possibile controllare anche i privilegi correnti utilizzando SHOW GRANTS.

SHOW GRANTS FOR 'user_name'@'host';

3. Le tabelle temporanee influenzano l’utilizzo del disco?

Sì, possono.
Per impostazione predefinita, le tabelle temporanee di MySQL utilizzano il motore MEMORY, ma quando la dimensione dei dati supera una certa soglia, vengono memorizzate in un’area temporanea InnoDB.

Quando si lavora con grandi set di dati, le tabelle temporanee possono consumare spazio su disco. Pertanto, si consiglia di eliminarle esplicitamente quando non sono più necessarie.

DROP TEMPORARY TABLE IF EXISTS table_name;

Per minimizzare l’impatto sul disco, se si prevedono grandi volumi di dati, considerare la creazione della tabella temporanea con InnoDB invece di MEMORY.

CREATE TEMPORARY TABLE table_name (
    column1 data_type,
    column2 data_type
) ENGINE=InnoDB;

4. Qual è la differenza tra una tabella temporanea e una tabella temporanea interna?

ItemTemporary tableInternal temporary table
Creation methodCreated by the user with CREATE TEMPORARY TABLEAutomatically created by MySQL during processing such as GROUP BY
ScopeOnly within the creating sessionOnly during query execution
DeletionExplicitly dropped with DROP TEMPORARY TABLEAutomatically dropped when the query completes

5. Le tabelle temporanee possono essere condivise tra thread?

No, non possono.
Una tabella temporanea è valida solo all’interno del thread (sessione) in cui è stata creata e non può essere accessibile da altri thread o processi.

Se è necessario condividere dati tra sessioni/thread, è necessario creare una tabella regolare invece.

CREATE TABLE shared_temp_table (
    id INT PRIMARY KEY,
    data VARCHAR(255)
);

6. Le tabelle temporanee possono ridurre le prestazioni?

Sì, in alcuni casi.
In particolare, prestare attenzione nelle seguenti situazioni:

  • Quando il volume di dati è troppo grande
  • Il motore MEMORY ha limiti di dimensione; oltre a ciò, i dati possono passare a InnoDB , il che può ridurre le prestazioni .
  • Mitigazione: Se si prevede di superare i limiti MEMORY, creare la tabella con InnoDB fin dall’inizio.
  • Quando non sono impostati indici appropriati
  • Le tabelle create con CREATE TEMPORARY TABLE ... SELECT non copiano gli indici , quindi le ricerche possono diventare più lente.
  • Mitigazione: Aggiungere indici se necessario utilizzando ALTER TABLE .
    ALTER TABLE temp_table_name ADD INDEX (column_name);
    

7. Come posso migliorare le prestazioni delle tabelle temporanee?

Per migliorare le prestazioni delle tabelle temporanee, i seguenti approcci sono efficaci:

Utilizzare il motore MEMORY (veloce per piccoli set di dati)

CREATE TEMPORARY TABLE table_name (
    id INT PRIMARY KEY,
    name VARCHAR(50)
) ENGINE=MEMORY;

Selezionare solo le colonne richieste (omettere colonne non necessarie)

CREATE TEMPORARY TABLE users_temp AS
SELECT id, name FROM users;

Aggiungere indici appropriati (accelerare le ricerche)

ALTER TABLE users_temp ADD INDEX (name);

Eliminare il prima possibile quando non è più necessario (liberare memoria)

DROP TEMPORARY TABLE IF EXISTS users_temp;

Riepilogo

  • Le tabelle temporanee non possono essere referenziate da altre sessioni o thread
  • È necessario il privilegio CREATE TEMPORARY TABLES per crearle
  • Se i dati diventano troppo grandi, MySQL può passare da MEMORY a InnoDB, il che può ridurre le prestazioni
  • Aggiungere indici appropriati può accelerare le query
  • Eliminare le tabelle temporanee con DROP TEMPORARY TABLE è raccomandato quando non sono più necessarie

Questo completa una spiegazione dettagliata delle tabelle temporanee di MySQL, dai concetti base ai casi d’uso, limitazioni, alternative e FAQ.
Utilizzando appropriatamente le tabelle temporanee, è possibile migliorare significativamente l’efficienza dell’elaborazione dei dati.