How can I optimize this MySQL query, select rows that are NOT IN another table -
i have query:
select * ( select ign, max(aktualizacja) wywalony, datediff(curdate(),max(aktualizacja)) wywalony_dni_temu dump_armijny group ign ) ign not in ( select distinct ign dump_armijny aktualizacja = ( select max(aktualizacja) dump_armijny ) ) order wywalony desc
but takes ~2 seconds on 13k rows table, , grows fast, how can optimize it?
here query:
select a.* (select ign, max(aktualizacja) wywalony, datediff(curdate(), max(aktualizacja)) wywalony_dni_temu dump_armijny group ign ) ign not in (select distinct ign dump_armijny aktualizacja = (select max(aktualizacja) dump_armijny ) ) order wywalony desc;
typically not exists
more optimized not in
, select distinct
unnecessary in in
subquery anyway. write query this:
select ign, max(aktualizacja) wywalony, datediff(curdate(), max(aktualizacja)) wywalony_dni_temu dump_armijny not exists (select 1 dump_armijny a2 join (select max(aktualizacja) maxa dump_armijny) m on aktualizacja = m.maxa a.ign = a2.ign ) group ign order wywalony desc;
it bit hard follow logic of query, think same as:
select ign, max(aktualizacja) wywalony, datediff(curdate(), max(aktualizacja)) wywalony_dni_temu dump_armijny join (select max(aktualizacja) maxa dump_armijny) m group ign having wywalony <> m.maxa order wywalony;
in case, should define indexes. "must-have" dump_armijny(aktualizacja)
. not exists
version, want dump_armijny(ign, aktualizacja)
.
Comments
Post a Comment