ďťż
 
=?iso-8859-1?q?Zab=F3jcze_zapytanie_do_MySQL?= ďťż
 
=?iso-8859-1?q?Zab=F3jcze_zapytanie_do_MySQL?=
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

=?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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • natalia97.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com