=?iso-8859-1?q?Zab=F3jcze_zapytanie_do_MySQL?=
readytojump@o2.pl - 08-04-2006 00:04
=?iso-8859-1?q?Zab=F3jcze_zapytanie_do_MySQL?=
Witam, za pomoca PHP zadaje ponizsze pytanie do bazy MySQL. Proces mysql wskakuje na 99.9% obciazenia procesora i ani mysli przerwac dzialanie, czekalem z 5 minut, zaden timeout nie zadzialal wiec generalnie serwer zawiesza sie.
Czy to wogole mozliwe zeby dwuprocesorowy (xeony) swierzopostawiony linux dal sie zarznac poprzez zadanie mysql'owi takiego zapytania?
A nawet jesli, jaka jest przyczyna ze mysql nie portafi przerwac swojego dzialania po jakims timeoucie?
SELECT DISTINCT f.portal_id = 1 AS 'base_portal', f.firma_uniqid FROM firmy AS f LEFT OUTER JOIN firmy_w_kat AS k ON ( f.firma_autoid = k.firma_autoid ) , kat AS t LEFT OUTER JOIN kat_w_langs AS kl ON ( t.kat_id = kl.kat_id ) , kat AS t2 LEFT OUTER JOIN kat_w_langs AS kl2 ON ( t2.kat_id = kl2.kat_id ) WHERE f.firma_kosz != 't' AND kl.lang_id =1 AND kl2.lang_id =1 AND f.firma_status != '0' AND ( ( f.firma_status <10 AND f.portal_id =1 ) OR ( f.firma_status =1 AND f.portal_id !=1 ) ) AND ( f.firma_nazwa LIKE '%torunske%' OR f.firma_miasto LIKE '%torunske%' OR f.firma_opis LIKE '%torunske%' OR kl.kat_nazwa LIKE '%torunske%' OR kl2.kat_nazwa LIKE '%torunske%' )
--- ReadyToJump
Lemat - 08-04-2006 00:04
readytojump@o2.pl napisał(a): > Witam, > za pomoca PHP zadaje ponizsze pytanie do bazy MySQL. Proces mysql > wskakuje na 99.9% obciazenia procesora i ani mysli przerwac dzialanie, > czekalem z 5 minut, zaden timeout nie zadzialal wiec generalnie serwer > zawiesza sie. > > FROM firmy AS f > LEFT OUTER JOIN firmy_w_kat AS k ON ( f.firma_autoid = k.firma_autoid ) > , kat AS t > LEFT OUTER JOIN kat_w_langs AS kl ON ( t.kat_id = kl.kat_id ) , kat AS > t2 > LEFT OUTER JOIN kat_w_langs AS kl2 ON ( t2.kat_id = kl2.kat_id )
zauważ, że robisz złożenie 4ech tabel. teraz będę trochę prawił herezje, ale będą one dobre z punktu widzenia przyszłej optymalizacji tego zapytania:
mysql najpierw zrobi sobie złożenie tych tabel według podanego warunku w "ON", jeżeli każda z tabel zawiera po 1000 rekordów, to może się okazać, że takie złożenie wygeneruje tabelę tymczasową o objętości 1000*1000*1000*1000 rekordów. Na takiej tabeli potem jest wykonywany warunek "WHERE". Krótko mówiąc nie rób złożenia N>>2 tabel tam, gdzie tabele mają wiele rekordów, oraz złożenie nie odbywa się po kolumnach będących indexami.
-- Pozdrawiam Lemat abuse z amm.net.pl: SPAM to nie zamówiona przesyłka reklamowa wysłana do odbiorcy bez jego zgody. W przypadku Usenet to nie zachodzi - Pana sam pobrał tę pocztę - konfigurując konto grupy w swoim komputerze, tym samym wyrażając zgodę na odbieranie wszystkiego co tam jest.
baklarz - 08-04-2006 00:04
Dnia 07.04.2006 readytojump@o2.pl <readytojump@o2.pl> napisał/a: > Witam, > za pomoca PHP zadaje ponizsze pytanie do bazy MySQL. Proces mysql > wskakuje na 99.9% obciazenia procesora i ani mysli przerwac dzialanie, > czekalem z 5 minut, zaden timeout nie zadzialal wiec generalnie serwer > zawiesza sie. [...] Ile masz rekordów w tabelach ? Jak wygląda plan zapytania ? Jakie są indeksy ? Czy na pewno potrzebujesz LIKE %pattern% ?
Poza tym są zapytania, które potrafią przy odpowiedniej ilości danych/częstotliwości wywołań zabić dowolny serwer ...
-- Tomasz Drobiszewski
ReadyToJump - 08-04-2006 00:04
=?iso-8859-2?q?Re:_Zab=F3jcze_zapytanie_do_MySQL?=
Tabela firmy to jakies 10000 rekordow, firmy_w_kat okolo 15000, kat niewiele.
Na wszystkich kolumnach procz tych na ktorych wykonuje LIKE sa indexy, natomiast czesc indexow PRIMARY obejmuje kilka kolumn. Np. tabela firmy_w_kat: PRIMARY KEY (`firma_autoid`,`kat_id`,`portal_id`) Czy warto utworzyc oddzielny klucz autoincrement dla rekordow tej tabeli a pozostale 3 indexy dac oddzielnie?
Jesli chodzi o LIKE %pattern% to musi byc ze wzgledu na to ze zapytanie obsluguje formularz wyszukiwania frazy dostepny dla uzytkownika serwisu.
Wlasnie odkrylem ze zmodyfikowana wersja tego zapytania posiadajaca dodatkowo ponizsze warunki, dziala bez zarzutu.
[...] AND f.firma_autoid = k.firma_autoid AND k.kat_id = t.kat_id AND t.kat_w_kat_id = t2.kat_id AND k.kat_id = 14
--- ReadyToJump
Grzegorz Szyszlo - 08-04-2006 00:04
ReadyToJump wrote: > Tabela firmy to jakies 10000 rekordow, firmy_w_kat okolo 15000, kat > niewiele. > > Na wszystkich kolumnach procz tych na ktorych wykonuje LIKE sa indexy, > natomiast czesc indexow PRIMARY obejmuje kilka kolumn. > Np. tabela firmy_w_kat: PRIMARY KEY > (`firma_autoid`,`kat_id`,`portal_id`) > Czy warto utworzyc oddzielny klucz autoincrement dla rekordow tej > tabeli a pozostale 3 indexy dac oddzielnie? > > Jesli chodzi o LIKE %pattern% to musi byc ze wzgledu na to ze zapytanie > obsluguje formularz wyszukiwania frazy dostepny dla uzytkownika > serwisu. > > Wlasnie odkrylem ze zmodyfikowana wersja tego zapytania posiadajaca > dodatkowo ponizsze warunki, dziala bez zarzutu. > > [...] > AND f.firma_autoid = k.firma_autoid > AND k.kat_id = t.kat_id > AND t.kat_w_kat_id = t2.kat_id > AND k.kat_id = 14
I tak do kitu, bo:
SELECT DISTINCT f.portal_id = 1 AS 'base_portal', f.firma_uniqid -- ^^^^^^^^ Distinct juz moze zabijac -- ^^^^^^^^^^^^^^^ co to jest? robisz tutaj przypisanie?
FROM firmy AS f LEFT OUTER JOIN firmy_w_kat AS k ON ( f.firma_autoid = k.firma_autoid ) -- *1 (o tym nizej) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ , kat AS t -- ^^^^^^^^ a to co za licho? czemu tego nie wladujesz na sam poczatek? -- przynajmniej od razu bedziesz widzial jakie kolumny zwraca zapytanie, -- bez czytania calosci. LEFT OUTER JOIN kat_w_langs AS kl ON ( t.kat_id = kl.kat_id ) , kat AS -- jak w *1 t2 LEFT OUTER JOIN kat_w_langs AS kl2 ON ( t2.kat_id = kl2.kat_id ) -- jak w *1 WHERE f.firma_kosz != 't' -- ^^^^^^^^^^^^^^^^^^^^ skoro warunek z AND, dlaczego nie odrazu w ON -- co zaznaczylem przez *1 ? -- od razu ograniczysz wielkosc zlaczenia. AND kl.lang_id =1 AND kl2.lang_id =1 AND f.firma_status != '0' -- to samo to, i wszystko powyzej, tez do ON. AND ( ( f.firma_status <10 AND f.portal_id =1 ) OR ( f.firma_status =1 AND f.portal_id !=1 ) ) AND ( f.firma_nazwa LIKE '%torunske%' OR f.firma_miasto LIKE '%torunske%' OR f.firma_opis LIKE '%torunske%' OR kl.kat_nazwa LIKE '%torunske%' OR kl2.kat_nazwa LIKE '%torunske%' ) -- a owe %costam% wyglada mi na blad projektowy. -- wywal przypisanie wojewodztwa do osobnej kolumny.
takie wyszukiwania z %costam% nie moga uzywac indeksu. jak cos takiego stosujesz, zastanow sie nad mechanizmami wyszukiwania pelnotekstowego. jak z tym jest w mysql, nie wiem.
no to tyle. znik.
ReadyToJump - 08-04-2006 00:04
=?iso-8859-1?q?Re:_Zab=F3jcze_zapytanie_do_MySQL?=
Rozwiazeniem problemu byl brak nastepujacych polaczen: AND k.kat_id = t.kat_id AND t.kat_w_kat_id = t2.kat_id Dziwie sie tylko ze debugger nie zasygnalizowal bledu ani zaden timeout nie wystapil.
Podlaczylem te warunki *1 w ON juz podczas LEFT OUTER JOIN i wyglada na to ze chodzi lepiej.
> SELECT [...] f.portal_id = 1 AS 'base_portal' [...] to daje mi wartosc boolowska ktora pozniej wykorzystuje przy ORDER BY
Pozdrawiam --- ReadyToJump
=?ISO-8859-2?Q?Micha=B3?= Kuratczyk - 08-04-2006 00:04
ReadyToJump wrote: > Dziwie sie tylko ze debugger nie zasygnalizowal bledu ani zaden timeout > nie wystapil. A czemu miałby? Kazałeś coś bazie zrobić, to robiła. A że kazałeś jej zrobić coś innego niż miałeś na myśli, to Twój błąd - baza tylko wykonuje polecenia. :-)
-- Michał Kuratczyk
Grzegorz Szyszlo - 08-04-2006 00:04
ReadyToJump wrote:
>>SELECT [...] f.portal_id = 1 AS 'base_portal' [...] > > to daje mi wartosc boolowska ktora pozniej wykorzystuje przy ORDER BY
faktycznie. mam jakies zaciemnienie ;) skojarzylo mi sie z przypisaniem, co tu jest oczywiscie bzdurą. ma to znacznienie w C itp, gdzie == i = działają inaczej.
znik.
pluton - 11-04-2006 00:22
Witam,
> f.firma_nazwa LIKE '%torunske%'
Poprzednicy mieli 100% racji, ja bym tylko wpisal 'torunskie' a nie 'torunske' :)
pozdrawiam pluton
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Gdzie MySQL 4.1, a gdzie 5.0?
[MS SQL] "set names" (mySQL) w MS SQL
oracle -> oracle lub oracle -> mysql replikacja - programy
[MySQL] Zwrot tego, co pasuje i nie pasuje :-/
[pgsql] Dostosowanie składni MySQL 5.0 -> PGSQL 8.1
[mysql] galeria zdjec - numerowanie zdjec
[mysql] CONCAT agregujący, ale nie GROUP_CONCAT()
mysql data 0000-00-00 na koniec
[MySQL] Problem z zapisem danych w bazie danych
jak przenieesc czesc tabeli do innej tabeli MySQL
zanotowane.pldoc.pisz.plpdf.pisz.plnatalia97.htw.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|