Mysql
 sql >> Database >  >> RDS >> Mysql

Quando mi unisco a una tabella molto piccola/vuota, perché MySQL esegue una scansione completa nonostante io stia usando LIMIT?

L'ottimizzatore MySQL deciderà prima l'ordine/il metodo di unione, quindi verificherà se, per l'ordine di unione scelto, è possibile evitare l'ordinamento utilizzando un indice. Per la query lenta in questa domanda, l'ottimizzatore ha deciso di utilizzare il join Block-Nested-Loop (BNL).

BNL è solitamente più veloce dell'utilizzo di un indice quando una delle tabelle è molto piccola (e non c'è LIMITE).

Tuttavia, con BNL, le righe non arriveranno necessariamente nell'ordine dato dalla prima tabella. Quindi, il risultato del join deve essere ordinato prima di applicare il LIMIT.

Puoi disattivare BNL set optimizer_switch = 'block_nested_loop=off';