Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Limit i różnice w czasie wykonania zapytania
snemeii
post
Post #1





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 10.05.2012

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
alegorn
post
Post #2





Grupa: Zarejestrowani
Postów: 341
Pomógł: 40
Dołączył: 23.06.2009

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
snemeii
post
Post #3





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 10.05.2012

Ostrzeżenie: (0%)
-----


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.

Ten post edytował snemeii 10.05.2012, 17:05:11
Go to the top of the page
+Quote Post
maly_swd
post
Post #4





Grupa: Zarejestrowani
Postów: 744
Pomógł: 118
Dołączył: 14.02.2009
Skąd: poziome

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
snemeii
post
Post #5





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 10.05.2012

Ostrzeżenie: (0%)
-----


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)... (IMG:style_emoticons/default/sad.gif)
Go to the top of the page
+Quote Post
uupah5
post
Post #6





Grupa: Zarejestrowani
Postów: 207
Pomógł: 18
Dołączył: 4.09.2010
Skąd: warszawa

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Niktoś
post
Post #7





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


Też coś mi się wydaje dziwne ,że przy 123 wierszach MySql sobie siada.
Go to the top of the page
+Quote Post
snemeii
post
Post #8





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 10.05.2012

Ostrzeżenie: (0%)
-----


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ę... (IMG:style_emoticons/default/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.

Go to the top of the page
+Quote Post
uupah5
post
Post #9





Grupa: Zarejestrowani
Postów: 207
Pomógł: 18
Dołączył: 4.09.2010
Skąd: warszawa

Ostrzeżenie: (0%)
-----


cytując klasyk "ja tu widzę niezły burdel" (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
maly_swd
post
Post #10





Grupa: Zarejestrowani
Postów: 744
Pomógł: 118
Dołączył: 14.02.2009
Skąd: poziome

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.12.2025 - 08:51