Ho un tavolo foo
con (tra le altre 20) colonne bar
, baz
e quux
con indici su baz
e quux
. La tabella ha ~ 500k righe.Perché MAX() 100 volte più lento di ORDER BY ... LIMIT 1?
Perché quanto segue per le query differisce tanto nella velocità? La query A richiede 0,3 secondi, mentre la query B richiede 28 secondi.
Query Un
select baz from foo
where bar = :bar
and quux = (select quux from foo where bar = :bar order by quux desc limit 1)
Spiegare
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY foo ref quuxIdx quuxIdx 9 const 2 "Using where"
2 SUBQUERY foo index NULL quuxIdx 9 NULL 1 "Using where"
Query B
select baz from foo
where bar = :bar
and quux = (select MAX(quux) from foo where bar = :bar)
Spiegate
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY foo ref quuxIdx quuxIdx 9 const 2 "Using where"
2 SUBQUERY foo ALL NULL NULL NULL NULL 448060 "Using where"
Io uso MySQL 5.1.34.
'LiMIT 1' significa prendere 1 riga e fermarsi, non è vero?la query B è O (n * m) – jondinham
@PaulDinh sembra che entrambe le query producano lo stesso risultato, molto probabilmente è legato all'ordine delle operazioni, nel primo caso ordina per quux e barra di ricerca dal risultato (veloce) nella seconda query barra di ricerca (necessario per controllare l'intera tabella) da unsorted e quindi ordinare per trovare max –
@Viktor, puoi per favore mostrare 'spiegare select baz da foo dove bar =: bar e quux = (seleziona quux da foo dove quux = MAX (quux) e bar =: bar) ' ' spiega select baz da foo dove bar =: bar e quux = (seleziona quux da foo dove quux = MAX (quux) e bar =: bar limite 1) ' –