[MySQL] jak zoptymalizować zapytanie?
Grzesiek - 27-07-2007 00:01
[MySQL] jak zoptymalizować zapytanie?
Witam!
Mam takie tabele:
1. desc CZASY id01 char(15) dep01 char(4) kom01 char(5) a decimal(5,2)
Indeksy dla CZASY: Nazwa klucza Typ Moc Pole PRIMARY PRIMARY 432 id01 id01 INDEX 3 id01 kom01 INDEX 14 kom01
2. desc PROGNOZA id char(15) Nie b01 decimal(7,0) Nie 0 b02 decimal(7,0) Nie 0 ...... b52 decimal(7,0) Nie 0 CUSER char(10) Nie CWSID char(10) Nie CDATE decimal(6,0) Nie 0 CTIME
Indeksy dla PROGNOZA Nazwa klucza Typ Moc Pole PRIMARY PRIMARY 308 id CUSER INDEX 6 CUSER
3. PROGNOZA_TEMP jest kopią PROGNOZA
SELECT SUM((A/100)* $B01) FROM PROGNOZA LEFT JOIN CZASY ON CZASY.ID01 = PROGNOZA.ID WHERE ID IN (SELECT ID01 FROM CZASY WHERE DEP01 ='DEPART01' ) AND ID NOT IN (SELECT ID FROM PROGNOZA_TEMP LEFT JOIN CZASY ON CZASY.ID01 = PROGNOZA_TEMP.ID WHERE DEP01 ='DEPART01')
Teraz te zapytanie wywoływane jest w pętli (PHP) no i strona sie troszkę długo otwiera. Czy macie jakis pomysł aby zoptymalizować te zapytanie?Moze niepoprawnie ustawiłem indeksy? Dzięuję bardzo za pomoc.
Pozdrawiam Grzesiek
-- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
=?ISO-8859-2?Q?Rafa=B3_Korszu=F1?= - 27-07-2007 00:01
Grzesiek napisał(a): > Witam! > > > 3. PROGNOZA_TEMP jest kopią PROGNOZA > > SELECT SUM((A/100)* $B01) FROM PROGNOZA LEFT JOIN > CZASY ON CZASY.ID01 = PROGNOZA.ID WHERE ID IN (SELECT ID01 FROM CZASY WHERE > DEP01 ='DEPART01' ) > AND ID NOT IN (SELECT ID FROM PROGNOZA_TEMP LEFT JOIN CZASY ON CZASY.ID01 = > PROGNOZA_TEMP.ID WHERE DEP01 ='DEPART01') > >
Witam, Spróbuj najpierw dać explain na tym zapytaniu i zobaczyć co się dzieje, i spróbuj zrobić całość w 1 zapytaniu a następnie w pętli obrabiaj wynik.
Rafał
-- Archiwum grupy: http://niusy.onet.pl/pl.comp.bazy-danych
scss@poczta.onet.pl - 27-07-2007 00:01
Dzięki za szybką odpowiedź
Niżej wynik explaina, którego zrobiłem zanim napisałem na grupę. I właśnie za pomocą explaina wybrałem indeksy. Po ustawieniu indeksów pomogło, ale to jeszcze nie to...
Co do jednego zapytania... właśnie próbuję, ale mam ciągle coś nie tak. Spróbuję jeszcze jak radzisz wrzucić do pętli jednym zapytaniem chociaż boję się ze będzie jeszcze gorzej, bo danych jest dużo i z kolei www, js i php się zamulą.
*************************** 1. row *************************** id: 1 select_type: PRIMARY table: PROGNOZA type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 308 Extra: Using where *************************** 2. row *************************** id: 1 select_type: PRIMARY table: CZASY type: eq_ref possible_keys: PRIMARY key: PRIMARY key_len: 45 ref: PROGNOZA.ID rows: 1 Extra: *************************** 3. row *************************** id: 3 select_type: DEPENDENT SUBQUERY table: PROGNOZA_TEMP type: system possible_keys: PRIMARY,ID key: NULL key_len: NULL ref: NULL rows: 1 Extra: *************************** 4. row *************************** id: 3 select_type: DEPENDENT SUBQUERY table: CZASY type: const possible_keys: PRIMARY,DEP01 key: PRIMARY key_len: 45 ref: const rows: 1 Extra: *************************** 5. row *************************** id: 2 select_type: DEPENDENT SUBQUERY table: ITEMROUT type: unique_subquery possible_keys: PRIMARY,DEP01 key: PRIMARY key_len: 45 ref: func rows: 1 Extra: Using index; Using where
Jeszcze raz dzięki za pomoc. Pozdrawiam Grzesiek
-- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
=?ISO-8859-2?Q?Rafa=B3_Korszu=F1?= - 27-07-2007 00:01
scss@poczta.onet.pl napisał(a): > Dzięki za szybką odpowiedź > > Niżej wynik explaina, którego zrobiłem zanim napisałem na grupę. > I właśnie za pomocą explaina wybrałem indeksy. > Po ustawieniu indeksów pomogło, ale to jeszcze nie to... > > Co do jednego zapytania... właśnie próbuję, ale mam ciągle coś nie tak. > Spróbuję jeszcze jak radzisz wrzucić do pętli jednym zapytaniem chociaż boję się > ze będzie jeszcze gorzej, bo danych jest dużo i z kolei www, js i php się zamulą. > > > próbowałeś odwrócić warunki w zapytaniu ??
Rafał -- Archiwum grupy: http://niusy.onet.pl/pl.comp.bazy-danych
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 27-07-2007 00:01
Grzesiek wrote: > Witam! > > > SELECT SUM((A/100)* $B01) FROM PROGNOZA LEFT JOIN > CZASY ON CZASY.ID01 = PROGNOZA.ID WHERE ID IN (SELECT ID01 FROM CZASY WHERE > DEP01 ='DEPART01' ) > AND ID NOT IN (SELECT ID FROM PROGNOZA_TEMP LEFT JOIN CZASY ON CZASY.ID01 = > PROGNOZA_TEMP.ID WHERE DEP01 ='DEPART01') > > Teraz te zapytanie wywoływane jest w pętli > (PHP) no i strona sie troszkę długo otwiera. Czy macie jakis pomysł aby > zoptymalizować te zapytanie?Moze niepoprawnie ustawiłem indeksy? > Dzięuję bardzo za pomoc.
1. Formatowanie kodu JEST WAŻNE. Szczególnie jak oczekujesz od innych poomocy na jego temat. 2. Jaki jest czas wykonania zapytania? 3. Jak wygląda pętla, bo to tu masz problem?
-- P.M.
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[mysql] =?ISO-8859-2?Q?Za=E6mienie=2E=2E=2E_jak_wy=B6wietli=E6?==?ISO-8859-2?Q?=2E=2E=2E?=
[mysql] =?ISO-8859-2?Q?wielko=B6=E6_bazy_a_stabilno=B6=E6=2C?==?ISO-8859-2?Q?_podzia=B3_du=BFej_bazy_a_powi=B1zania_tabel?=
[MySQL] =?ISO-8859-2?Q?Wy=B6wietlenie_kolejnej_pozycji=2C_?==?ISO-8859-2?Q?jak=B1_mia=B3by_dany_rekord=2C_gdybym_czyta=B3 _?==?ISO-8859-2?Q?wg_konkretnych_kryteri=F3w=2E_Da_si=EA_=3F?=
[mysql 4.0.x] przenoszenie kolum =?ISO-8859-2?Q?mi=EAdzy_bazam?==?ISO-8859-2?Q?i_cd_=2E=2E=2E_?=
[MySQL] =?ISO-8859-2?Q?z=B3=B1czenie_tabeli_u=BFytkownik_i?==?ISO-8859-2?Q?_zdj=EAcia_z_wyborem_zdj=EAcia_domy=B6lnego?=
[MySQL] Jak =?ISO-8859-2?Q?wpisa=E6_do_tabeli_pozycje_dl?==?ISO-8859-2?Q?a_wierszy_gdybym_te_wiersze_wybiera=B3_w_ok?== ?ISO-8859-2?Q?re=B6lonej_kolejno=B6ci_=3F?=
Gdzie MySQL 4.1, a gdzie 5.0?
[MySQL 4.0...4.1] zabezpieczenie przed =?ISO-8859-2?Q?jednoczesn?==?ISO-8859-2?Q?=B1_edycj=B1?=
[MS SQL] "set names" (mySQL) w MS SQL
MySQL - jak =?ISO-8859-2?Q?wyeksportowa=E6_zawarto=B6=E6_wie?==?ISO-8859-2?Q?lkiej_tabeli?=
zanotowane.pldoc.pisz.plpdf.pisz.plmisida.pev.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 |
|