Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Limit i różnice w czasie wykonania zapytania
Forum PHP.pl > Forum > Bazy danych > MySQL
snemeii
Witam wszystkich,

Zwracam się o pomoc... odnośnie mojego problemu.

Mam 3 tabele:

TAB1 - okoł 14tyś wierszy
TAB2 - około 600tyś wierszy
TAB3 - około 3tyś wierszy

wszystkie tabele są ze sobą w relacji i teraz....

Jeżeli wykonuję:
  1. SELECT TAB1.*
  2. FROM TAB1 t1
  3. INNER JOIN TAB2 ON ....
  4. INNER JOIN TAB3 ON ....
  5. LIMIT 122


to czas wykonania mam ~ 78ms

natomiast jak limit zmienie na LIMIT 123 to już czas wykonania idzie pod 20s.

Z ciekawości usunąłem z TAB1 kilka pierwszych wierszy by zobaczyć czy coś się zmienia, ale nie dla LIMIT 122 mam ~78ms, a dla LIMIT 123 mam 20s.

Czy mogę jakoś MySQL przyspieszyć, o co może chodzić...

MySQLa mam w wersji: Wersja serwera: 5.5.17

Pzdr
alegorn
dziwne.

obstawiam ze robi ci tempa po drodze.
wtedy jesli przekroczy ilosc pamieci jaka moze zmiescic w ramie - zapisuje to na dysk...

to jedyne rozwiazanie jakie mi w tej chwili do glowy przychodzi..



tak naprawde pokaz explain dla jednego i drugiego zapytania - bedzie mozna cos wiecej powiedziec.

j.
snemeii
Ok zrobiłem tak jak mówisz dodałem:

  1. EXPLAIN SELECT TAB1.*
  2. FROM TAB1 t1
  3. INNER JOIN TAB2 ON ....
  4. INNER JOIN TAB3 ON ....
  5. LIMIT 122


i otrzymałem to...

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE sp ALL NULL NULL NULL NULL 2221
1 SIMPLE ei ALL NULL NULL NULL NULL 13219 Using where; Using join buffer
1 SIMPLE si ALL NULL NULL NULL NULL 319440 Using where; Using join buffer

(oczywiscie nazwy tabel i ilość wierszy w tym przypadku jest delikatnie inna - inna baza)

...albo problem jest w tym że mySQL działa na domyślnych ustawieniach, być może należałoby jakieś parametry zmienić.
Nadmienię, że baza pracuje w środowisku Windowsowym.
maly_swd
Tak jak Kolega wczesniej napisal. Mysql nie miesci danych w ramie i robi zrzut na dysk. Moze byc duzo parametrow za to odpowiedzialnych.

Zrob taki test ze zamiast SELECT * daj tylko jedna kolumne wtedy jest mniej danych mielonych.
snemeii
Zrobiłem tak jak mówisz...

  1. SELECT TAB1.ID
  2. FROM TAB1 t1
  3. INNER JOIN TAB2 ON ....
  4. INNER JOIN TAB3 ON ....
  5. LIMIT 123


i faktycznie, poszło szybko. W moim przypadku parametrów do wyciągnięcia było max 10.
Ale jak mam sobie poradzić z tym zapytaniem skoro mam do przelecenia ~ 2tyś wierszy (a nie 123)... sad.gif
uupah5
czy tylko ja mam wrażenie, że coś tu jest mocno nie halo?
albo mimo wszystko robisz w tym zapytaniu iloczyn kartezjański, albo masz w tych tabelach BLOBy albo.. konfiguracja serwera mysql jest kuriozalna.
czy sytuacja występuje na innym serwerze (np maszynie developerskiej) albo możesz wykonać taki test? najlepiej na standardowej konfiguracji.
możesz zrobić wklejkę (pastebin) show create table wszystkich tabel + dokładny kod tego selecta?
przypadek jest tak dziwaczny.
Niktoś
Też coś mi się wydaje dziwne ,że przy 123 wierszach MySql sobie siada.
snemeii
Panowie mam przyczynę problemu... człowiek się uczy całe życie...

Tak jak pisałem, mam tabele:

TAB1 - okoł 14tyś wierszy
TAB2 - około 600tyś wierszy
TAB3 - około 3tyś wierszy

są to tabele, których zawartość zaimportowana jest z DBFów. W tych DBFach był na tyle duży bałagan, że powiązania ktoś do innych tabel porobił po dwóch kolumnach typu VARCHAR. Czyli TAB1 "relacjonował" do TAB2 po dwóch kolumnach VARCHAR i TAB1 "relacjonował" do TAB3 po dwóch kolumnach VARCHAR.

Po zrobieniu importu tych calych danych z DBFow, w każdej z tabel utworzyłem sobie na początku kolumnę z INDEKSEM (AUTO_INCREMENT), jednak nie miało to z niczym powiązania dlatego złączenia musiałem robić po tych VARCHARACH i tu był problem tego długiego wykonywania zapytania...

Nie zważając na długość wykonywania skryptu, puściłem go i wykonywał sie on całą nockę... smile.gif

Treaz mam tabelę TAB4, która posiada dane z tabeli TAB1 ale co najważniejsze posiada powiązania po INDEKSACH do tabel TAB2 i TAB3. Wykonując teraz SELECT na 14tyś wierszach z tabeli TAB4 z powiązaniem po INDEKSACH do TAB2 i TAB3 wynik całościowy otrzymuję w 80ms.

uupah5
cytując klasyk "ja tu widzę niezły burdel" wink.gif
maly_swd
Z tego co pamietam (ale moge sie mylic - bo to moglo sie tyczyc do tabel MEMORY). To jesli robisz joiny z VARCHAR to zajmuja one tyle miejsca w pamieci ile maxymalnie vchar ma zadeklarowane
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-2024 Invision Power Services, Inc.