2016-02-19 14 views
5

Ho questa domanda, che è un singolo query contenente 3 seleziona complessivamente:Riutilizzo risultati di una singola query SELECT MySQL

SELECT a 
FROM tbl 
WHERE b IN ((SELECT a FROM tbl WHERE b = 44)) 
AND NOT a IN ((SELECT a FROM tbl WHERE b = 44)) 

La query

SELECT a FROM table WHERE b = 44 

è esattamente lo stesso, e suppongo che il database stia eseguendo questa operazione 2 volte, anche se dovrebbe essere più veloce la seconda volta a causa del caching ecc.

C'è un modo in SQL o qualcosa di specifico su MySQL che posso fare o riutilizzare il 100% dei risultati dalla prima esecuzione della query?

O altre idee su come velocizzare questa query?

Sto usando MySQL 5.7.

risposta

0

Salva prima selezionare tabella come temporanea quindi utilizzarlo per l'esecuzione di seconda query:

SELECT a, b 
INTO #temtbl 
FROM tbl 
WHERE b IN ((SELECT a FROM tbl WHERE b = 44)) 
AND NOT a IN ((SELECT a FROM tbl WHERE b = 44)) 

SELECT a,b FROM #temtbl WHERE b = 44 
2

Evitare query sub e utilizzando unisce (che dovrebbe utilizzare gli indici ed essere più efficiente).

SELECT tbl1.a 
FROM tbl tbl1 
INNER JOIN tbl tbl2 ON tbl1.b = tbl2.a AND tbl2.b = 44 
LEFT OUTER JOIN tbl tbl3 ON tbl1.a = tbl3.a AND tbl3.b = 44 
WHERE tbl3.a IS NULL 

A seconda se è possibile ottenere più corrispondenze sulla unisce allora si potrebbe essere necessario utilizzare DISTINCT dopo la SELECT.

+0

Works! È quasi 2x più lento del mio originale sebbene .. anche se sia a che b hanno indici. Sono i join che costano così tanto? – Niklas9

+0

I join dovrebbero essere in genere molto più veloci rispetto all'utilizzo delle sottocubine. Puoi pubblicare la tua tabella dichiara e una SPIEGARE della query? Hai un indice che copra ENTRAMBI a e b? – Kickstart

+0

Certo, ha creato questo elenco per la spiegazione - https://gist.github.com/Niklas9/5dd08c4d6b3b7b029365 No, indice per aeb separatamente. @Kickstart – Niklas9

0

Perché non si può fare:

SELECT tbl1.a 
FROM tbl AS t1 
INNER JOIN tbl AS t2 ON t1.b = t.a AND t2.b = 44 
WHERE t1.b <> 44 
Problemi correlati