mysql right Perché STRAIGHT_JOIN migliora così drasticamente questa query e cosa significa quando viene scritta dopo la parola chiave SELECT?



mysql right join (1)

Che cosa sta succedendo qui e in che modo il "join optimizer" può comportare prestazioni relativamente scarse?

STRAIGHT_JOIN forza l'ordine di join delle tabelle, quindi table1 viene scansionato nel ciclo esterno e table2 nel loop interno.

L'ottimizzatore non è perfetto (anche se abbastanza discreto), e la causa più probabile sono le statistiche obsolete.

Dovrei sempre usare STRAIGHT_JOIN

No, solo quando l'ottimizzatore è sbagliato. Ciò potrebbe verificarsi se la distribuzione dei dati è fortemente distorta o non può essere calcolata correttamente (ad esempio, per gli indici spaziali o fulltext).

Come posso sapere quando usarlo o no?

Dovresti raccogliere le statistiche, costruire i piani per entrambi i modi e capire cosa significano questi piani.

Se vedi che:

  1. Il piano generato automaticamente non è ottimale e non può essere migliorato secondo le modalità standard,

  2. La versione STRAIGHT_JOIN è migliore, capisci sempre e capirai perché lo farà sempre

, quindi usa STRAIGHT_JOIN .

Ho la seguente query MySql:

select t1.*
from Table1 t1
inner join Table2 t2
on t1.CommonID = t2.CommonID
where t1.FilterID = 1

Ci vogliono circa 30 secondi per funzionare, il che era strano, perché se commento la clausola join o the where ci vuole meno di un secondo: es.

select t1.*
from Table1 t1
where t1.FilterID = 1

o

select t1.*
from Table1 t1
inner join Table2 t2
on t1.CommonID = t2.CommonID

ognuno prende meno di un secondo.

Poi c'è la parola chiave STRAIGHT_JOIN, di cui posso trovare un riferimento, qui: http://dev.mysql.com/doc/refman/5.0/en/join.html

STRAIGHT_JOIN è simile a JOIN, tranne per il fatto che la tabella di sinistra viene sempre letta prima della tabella di destra. Questo può essere usato per quei (pochi) casi per i quali lo strumento di ottimizzazione dei join mette le tabelle nell'ordine sbagliato.

Che cosa? Posso scrivere:

select t1.*
from Table1 t1
STRAIGHT_JOIN  Table2 t2
on t1.CommonID = t2.CommonID
where t1.FilterID = 1

e la query viene eseguita in meno di un secondo.

Anche straniero, posso scrivere:

select STRAIGHT_JOIN  t1.*
from Table1 t1
inner join Table2 t2
on t1.CommonID = t2.CommonID
where t1.FilterID = 1

e ci vuole meno di un secondo, e questa sintassi non sembra nemmeno essere legale.

Direi che il secondo esempio indica che verrà utilizzato un STRAIGHT_JOIN ogni volta che viene scritto un JOIN INNER, ma non riesco a trovare alcuna documentazione a riguardo.

Che cosa sta succedendo qui e in che modo il "join optimizer" può comportare prestazioni relativamente scarse? Devo usare sempre STRAIGHT_JOIN? Come posso sapere quando usarlo o no?

Table1 e Table2 hanno entrambi chiavi primarie intere; FilterID è una chiave esterna a un'altra tabella; le colonne CommonID ​​sono entrambe chiavi esterne a una terza tabella. Entrambi hanno indici su di loro. Il motore del database è InnoDB.

Grazie





join