=?iso-8859-2?q?MySQL_-_nieoptymalne_zapytanie_-_jak_poprawi=E6=3F?=
webcm123@gmail.com - 17-06-2007 00:17
=?iso-8859-2?q?MySQL_-_nieoptymalne_zapytanie_-_jak_poprawi=E6=3F?=
Utworzy?em panel "najnowsze" w CMS-ie. Zapytanie do bazy danych jest jednak niewydajne.
SELECT z.ID, z.name FROM arts z INNER JOIN cats c ON z.cat=c.ID WHERE z.access!=2 AND c.access!=3 ORDER BY z.ID DESC LIMIT 0,10
Jak mo?na je zoptymalizowa??
S? 2 tabele - ARTS z literk? Z oraz CATS z literk? C (czy wyrzucenie 1 literki mo?e pomóc?). Nie potrzebuj? pobiera? danych z tabeli CATS, lecz tylko odwo?a? si? do niej podczas wyboru danych z tabeli ARTS.
Dobrze by by?o, aby zamiast c.access!=3 da?o si? optymalnie wykona?: (c.access="pl" OR c.access=1)
Piotr Keplicz - 17-06-2007 00:17
webcm123@gmail.com:
> Utworzy?em panel "najnowsze" w CMS-ie. Zapytanie do bazy danych jest > jednak niewydajne. > > SELECT z.ID, z.name FROM arts z INNER JOIN cats c ON z.cat=c.ID WHERE > z.access!=2 AND c.access!=3 ORDER BY z.ID DESC LIMIT 0,10 > > Jak mo?na je zoptymalizowa??
EXPLAIN zapytanie; Spójrz do manuala, który wyt?umaczy co jest czym w wyniku. Zapewne trzeba b?dzie zmodyfikowa? nieco indeksy.
..pk.
sg - 17-06-2007 00:17
webcm123@gmail.com pisze: > Utworzy?em panel "najnowsze" w CMS-ie. Zapytanie do bazy danych jest > jednak niewydajne. > > SELECT z.ID, z.name FROM arts z INNER JOIN cats c ON z.cat=c.ID WHERE > z.access!=2 AND c.access!=3 ORDER BY z.ID DESC LIMIT 0,10 > > Jak mo?na je zoptymalizowa?? > > S? 2 tabele - ARTS z literk? Z oraz CATS z literk? C (czy wyrzucenie 1 > literki mo?e pomóc?).
Wyrzucenie literki??? Rozumiem, ?e chcesz wyrzuci? tabel? z zapytania, ale si? nie uda skoro potem jeset odwo?anie do niej przez "c.access!=3".
> Nie potrzebuj? pobiera? danych z tabeli CATS, > lecz tylko odwo?a? si? do niej podczas wyboru danych z tabeli ARTS. > > Dobrze by by?o, aby zamiast c.access!=3 da?o si? optymalnie wykona?: > (c.access="pl" OR c.access=1) >
1. Sk?d wiesz, ?e to zapytanie jest nieoptymalne? 2. Jaka jest struktura tabel? 3. Jak wygl?da plan zapytania? 4. Jakie s? indeksy na tych tabelach? 5. Ile jest w nich rekordów?
A.L.E.C - 17-06-2007 00:17
webcm123@gmail.com wrote: > Utworzy?em panel "najnowsze" w CMS-ie. Zapytanie do bazy danych jest > jednak niewydajne. > > SELECT z.ID, z.name FROM arts z INNER JOIN cats c ON z.cat=c.ID WHERE > z.access!=2 AND c.access!=3 ORDER BY z.ID DESC LIMIT 0,10 > > Jak mo?na je zoptymalizowa?? > > S? 2 tabele - ARTS z literk? Z oraz CATS z literk? C (czy wyrzucenie 1 > literki mo?e pomóc?). Nie potrzebuj? pobiera? danych z tabeli CATS, > lecz tylko odwo?a? si? do niej podczas wyboru danych z tabeli ARTS. > > Dobrze by by?o, aby zamiast c.access!=3 da?o si? optymalnie wykona?: > (c.access="pl" OR c.access=1)
zapytania za bardzo si? zoptymalizowa? nie da, ale napisz czy masz indeks na polu access, jakiego jest ono typu, jakie przyjmuje warto?ci, poka? te? SELECT COUNT(*) FROM cats GROUP BY access
p.s. czy pole access nie powinno by? w arts?
-- Aleksander 'A.L.E.C' Machniak http://alec.pl gg:2275252 LAN Management System Developer http://lms.org.pl
webcm123@gmail.com - 17-06-2007 00:17
=?iso-8859-2?q?Re:_MySQL_-_nieoptymalne_zapytanie_-_jak_poprawi=E6=3F?=
Wynik zapytania EXPLAIN:
Wspólne: - wymagane przeszukania wszystkich rekordów - key => NULL (nie u?ywa ?adnego klucza?) - ref => NULL
Tabela ARTS: - possible_keys => cat - extra => using temporary (tego pewnie nie uniknie), where, filesort
Tabela CATS: - possible_keys => PRIMARY - rows => 3 (w tabeli s? 4 rekordy) - extra => using where
Dlaczego nie u?ywa indeksów? :O Je?li nie da si? lepiej zoptymalizowa? zapytania, b?d? zmuszony tworzy? bufor (cache) w postaci gotowego pliku .html lub .php.
webcm123@gmail.com - 17-06-2007 00:17
=?iso-8859-2?q?Re:_MySQL_-_nieoptymalne_zapytanie_-_jak_poprawi=E6=3F?=
Rekordów mam tylko kilka - 8 w arts i 4 w cats. Na polu ACCESS nie ma indeksu - zreszt? tam tylko mog? by? warto?ci 1 lub 2 (oraz 3, "pl", "en"... w tabeli CATS). Im wi?cej indeksów, tym wi?kszy rozmiar bazy. Je?li jednak indeks mo?e przyspieszy? zapytania, by? mo?e go wstawi?.
Przy wy?wietlaniu artyku?ów jest warunek: WHERE access=1 AND cat=3 jednak zapytanie wykonuje si? szybko (nawet gdy nie by?o klucza CAT). W tym przypadku indeks CAT jest jednak u?ywany.
A.L.E.C - 17-06-2007 00:17
webcm123@gmail.com wrote: > Rekordów mam tylko kilka - 8 w arts i 4 w cats.
Nie roz?mieszaj mnie, to ile trwa wykonanie tego zapytania i jakiego wyniku by? oczekiwa??
> Na polu ACCESS nie ma > indeksu - zreszt? tam tylko mog? by? warto?ci 1 lub 2 (oraz 3, "pl", > "en"... w tabeli CATS). Im wi?cej indeksów, tym wi?kszy rozmiar bazy. > Je?li jednak indeks mo?e przyspieszy? zapytania, by? mo?e go wstawi?.
Teraz zauwa?y?em, ?e access masz w obu tabelach, je?li mo?e przyjmowa? tylko dwie warto?ci to indeks pewnie nie wiele da, ale w tabeli cats ju? mo?e si? przyda?.
-- Aleksander 'A.L.E.C' Machniak http://alec.pl gg:2275252 LAN Management System Developer http://lms.org.pl
webcm123@gmail.com - 17-06-2007 00:17
=?iso-8859-2?q?Re:_MySQL_-_nieoptymalne_zapytanie_-_jak_poprawi=E6=3F?=
Kilka wywo?a?: 50ms, 1.3ms, 2.0ms (teraz przyspieszy?o, lecz przy wi?kszym obci??eniu zapytanie trwa?o ponad 10ms, a nieraz ponad 50ms).
Wniosek: najlepszym wyj?ciem jest tworzenie cache.
=?ISO-8859-2?Q?Micha=B3?= Kuratczyk - 17-06-2007 00:17
webcm123@gmail.com wrote: > Kilka wywo?a?: 50ms, 1.3ms, 2.0ms (teraz przyspieszy?o, lecz przy > wi?kszym obci??eniu zapytanie trwa?o ponad 10ms, a nieraz ponad 50ms). > > Wniosek: najlepszym wyj?ciem jest tworzenie cache.
Wniosek: testuj porz?dnie, na sensownych danych, a nie wyci?gasz wnioski na podstawie pseudotestów na pustych tabelach. A klepanie jakiego? cache bez ZDECYDOWANYCH ku temu przes?anek jest: strat? czasu, proszeniem si? o k?opoty, komplikowaniem systemu, dodawaniem sobie b??dów...
-- Micha? Kuratczyk
keczerad - 17-06-2007 00:17
webcm123@gmail.com napisa?(a): > Rekordów mam tylko kilka - 8 w arts i 4 w cats. Na polu ACCESS nie ma > indeksu - zreszt? tam tylko mog? by? warto?ci 1 lub 2 (oraz 3, "pl", > "en"... w tabeli CATS). Im wi?cej indeksów, tym wi?kszy rozmiar bazy. > Je?li jednak indeks mo?e przyspieszy? zapytania, by? mo?e go wstawi?. > > Przy wy?wietlaniu artyku?ów jest warunek: > WHERE access=1 AND cat=3 > jednak zapytanie wykonuje si? szybko (nawet gdy nie by?o klucza CAT). > W tym przypadku indeks CAT jest jednak u?ywany. >
przychylam sie to zdania ALECa, jestes niepowazny testujesz cos na 8 rekordach.
--
keczerad
http://www.e-mo.com.pl sklep w (X)HTML wraz z modulem do Subiekta GT
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.plmorebeer.opx.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 |
|