hteo bih da postavim pitanje u vezi tumacenja EXPLAIN naredbe u MySQL-u.
Imam jedan upit koji merenjem performansi pokazuje da traje preko 10s na nekih c.c.a. 500k zapisa.
Situacija je sledeca:
Korisnik entitet je podeljen na 2 tabele: Profile i User. (ne pitajte zasto i kako - applikacija je nasledjena i nema se mesta za mnogo menjanja)
Profile i User su vezani u odnosu Jedan - na - Jedan. Mada je moguce da u jednoj (ili cak obe) ima zapisa koji nemaju svog parnjaka u ovoj drugoj.
Takodje nepitajte zasto jer su podaci nasledjeni.
Upit koji je "problematican" je sledeci
SELECT p.`sifra`
FROM `profile` p, `user` u
WHERE p.`id` = u.`profile_id` AND p.`online` = FALSE AND p.`stvarno_online` = TRUE AND u.`datum_poslednjeg_logovanja` < "2012-07-03 15:55";
Pri cemu se ovaj query izvrsava svakih 1h, oko 13 - 15 sec svaki put.
p.sifra je dodan kao index u profile tabeli.
Ukoliko izbacim zadnji WHERE uslov (datum_poslednjeg_logovanja), i izvrsim EXPLAIN naredbu, dobijem sledeci result set
id|select_type|table|type|possible_keys|key|key_len|ref|rows|Extra
1|SIMPLE|u|index|FK_USER_PROFILE|FK_USER_PROFILE|8|(NULL)|473905|Using index
1|SIMPLE|p|eq_ref|PRIMARY|PRIMARY|8|db.u.profile_id|1|Using where
Medjutim kad ukljucim i zadnji WHERE onda se situacija menja:
id|select_type|table|type|possible_keys|key|key_len|ref|rows|Extra
1|SIMPLE|u|ALL|FK_USER_PROFILE|(NULL)|(NULL)|(NULL)|473905|Using where
1|SIMPLE|p|eq_ref|PRIMARY|PRIMARY|8|db.u.profile_id|1|Using where
Koliko sam video po nekim forumima, tutorijalima ALL kao type TREBA UVEK IZBEGAVATI.
Pokusao sam cak i sa dodavanjam index na datum_poslednjeg_logovanja koloni ali nije dalo znacajnije rezultate u performansama.
Da li bi neko bio ljubazan da mi objasni kako tumaciti EXPLAIN i da li je moguce i kako poboljsati performanse na ovom primeru.
Hvala
[Ovu poruku je menjao staleks dana 04.07.2012. u 09:30 GMT+1]