![]() ![]() |
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ę:
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 |
|
|
|
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. |
|
|
|
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:
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 |
|
|
|
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. |
|
|
|
Post
#5
|
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 0 Dołączył: 10.05.2012 Ostrzeżenie: (0%)
|
Zrobiłem tak jak mówisz...
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) |
|
|
|
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. |
|
|
|
Post
#7
|
|
|
Grupa: Zarejestrowani Postów: 1 195 Pomógł: 109 Dołączył: 3.11.2011 Ostrzeżenie: (10%)
|
Też coś mi się wydaje dziwne ,że przy 123 wierszach MySql sobie siada.
|
|
|
|
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. |
|
|
|
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)
|
|
|
|
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
|
|
|
|
![]() ![]() |
|
Aktualny czas: 23.12.2025 - 08:51 |