Sto tentando di memorizzare un risultato di query in una tabella temporanea per un'ulteriore elaborazione.Perché MySQL 'inserisce in ... selezionare ...' molto più lento di una selezione da solo?
create temporary table tmpTest
(
a FLOAT,
b FLOAT,
c FLOAT
)
engine = memory;
insert into tmpTest
(
select a,b,c from someTable
where ...
);
Ma per qualche motivo l'inserto richiede fino a un minuto, mentre la subselect prende solo pochi secondi. Perché impiegare molto più tempo a scrivere i dati su una tabella temporanea invece di stamparli sull'output del mio strumento di gestione SQL ???
UPDATE mio Setup: MySQL 7.3.2 Cluster con 8 Debian Linux NDB nodi di dati 1 SQL Node (Windows Server 2012)
La tabella sto correndo il select su è un ndb tavolo.
ho cercato di scoprire, se il piano di esecuzione può essere diverso quando si usa 'inserire nel ..', ma hanno lo stesso aspetto: (scusate per la formattazione, StackOverflow non ha tabelle)
id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY <subquery3> ALL \N \N \N \N \N \N 1 PRIMARY foo ref PRIMARY PRIMARY 3 <subquery3>.fooId 9747434 Using where 2 SUBQUERY someTable range PRIMARY PRIMARY 3 \N 136933000 Using where with pushed condition; Using MRR; Using temporary; Using filesort 3 MATERIALIZED tmpBar ALL \N \N \N \N 1000 \N
CREATE TABLE ... SELECT è lento anche. 47 secondi contro 5 secondi senza inserimento/creazione tabella.
Dovresti essere più specifico e fornire alcuni dati che stai scrivendo. Anche la sintassi 'INSERT .. SELECT' è diversa. Il tuo campione provocherà un errore. –
buona domanda. Non so davvero come mysql riserva 'memoria' per se stesso. Se passa attraverso l'API del sistema operativo, potrebbe semplicemente * richiede * per la memoria, che verrà quindi utilizzata come * ram * o * harddrive * space, in base allo stato del sistema. Vedi la gestione dei byte virtuali di Windows. – Sebas
Hai provato una query di tipo 'CREATE TABLE ... SELECT' per il confronto? http://dev.mysql.com/doc/refman/5.0/en/create-table-select.html – xiankai