Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: MYSQL, EXPLAIN
Forum PHP.pl > Forum > Bazy danych > MySQL
bcn
Witam,
mam dwie bazy danych w ramach jednego serwera, obie o takiej samej
strukturze, posiadaja podobna ilosc danych i na bazie1 zapytanie:

SELECT tmp.pesel,ew.wynik,ew.wynik_p,ew.wynik_r,o.imie,o.nazwisko

FROM _tmp_ew_wpr_lista as tmp
LEFT JOIN egzaminy_wyniki ew ON (tmp.egzamin=ew.egzamin AND
tmp.pesel=ew.pesel AND ew.studia="")
LEFT JOIN osoby o ON (tmp.pesel=o.pesel)
WHERE tmp.egzamin="EGZ_PRK_KONS"
ORDER BY tmp.pesel LIMIT 0,50;

wykonuje sie bardzo szybko a na bazie2 wolno(~30sek).

Zrobilem EXPLAIN QUERY i mam nastepujace wyniki:
baza1: http://wklej.org/id/359597/
baza2: http://wklej.org/id/359598/

Z tego co rozumiem to w przypadku bazy2 nie korzysta z indeksow.
Oto wynik SHOW INDEX dla bazy2(tabela egzaminy_wyniki, alias ew):
http://wklej.org/id/359601/

Nie jestem programista tej aplikacji, nie wiem tez gdzie szukac
problemu. Jak to moge poprawic? Jezeli potrzebne sa jeszcze jakies
informacje prosze pisac. Z gory dziekuje za pomoc.


EDIT:
ok, udalo mi sie znalesc jedna roznice: teraz w tabeli egzaminy_wyniki(alias ew) numer pesel ma dlugosc 255znakow(w starych bazach mial dlugosc 20znakow) podczasy gdy w innych tabelach ma dlugosc 32. Czy to moze byc przyczyna?
Mchl
A SHOW INDEX dla bazy1?
Jakie wersje MySQL na obu serwerach?
bcn
Cytat(Mchl @ 3.07.2010, 11:28:53 ) *
A SHOW INDEX dla bazy1?
Jakie wersje MySQL na obu serwerach?


prosze show index: http://wklej.to/KtfT
mysql troche archaiczny: 5.0.24

Zauwazylem tez zmiane, teraz w egzaminy_wyniki(ew) pesel ma dlugosc 255znakow, na wczesniejszej wersji bazy mial 20znakow. Czy to moze byc przyczyna? Gdzie znalesc przyczyne dlaczego nie uzywa indeksow tylko tak 'muli' to zapytanie?
Mchl
Tak, to może być przyczyna (aczkolwiek wątpię). Dla PESELu wystarczy CHAR(11) w kodowaniu ascii, tak czy inaczej zyskasz na zmianie.

Pokazałbyś jeszcze SHOW CREATE TABLE
bcn
Cytat(Mchl @ 3.07.2010, 12:34:34 ) *
Tak, to może być przyczyna (aczkolwiek wątpię). Dla PESELu wystarczy CHAR(11) w kodowaniu ascii, tak czy inaczej zyskasz na zmianie.

Pokazałbyś jeszcze SHOW CREATE TABLE



oto show create table dla tabeli egzaminy_wyniki:
baza1: http://wklej.org/id/359686/
baza2: http://wklej.org/id/359687/

co do zmian to i owszem, wiadomo, ze pesel az taki dlugi nie jest, niestety z tej bazy korzysta juz aplikacja, ktora dziala produkcyjnie, wiec takie zmiany moge zasugerowac autorom przy nastepnej rekrutacji:) Teraz musze znalezc przyczyne tych wolnych zapytan

EDIT:
znalazlem jeszcze inne roznice:
SHOW CREATE TABLE dla tabeli _tmp_ew_wpr_lista
baza1: http://wklej.org/id/359698/
baza2: http://wklej.org/id/359693/
zmienilo sie kodowanie

SHOW CREATE TABLE dla tabeli osoby:
baza1: http://wklej.org/id/359700/
baza2: http://wklej.org/id/359701/
rowniez roznica w dlugosci peselu oraz obie tabele maja kodowanie latin2
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.