Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Czy da się szybciej ?
Alek
post
Post #1





Grupa: Zarejestrowani
Postów: 47
Pomógł: 0
Dołączył: 25.06.2003
Skąd: Gdynia

Ostrzeżenie: (0%)
-----


Mam 2 tabele: 'informacje' i 'woj', w ktorych przechowuję informacje dotyczące danych województw.
W 'informacje' uzbierało się już ponad 50000 rekordów i niestety całość trochę zaczyna mulić.

struktura 'informacje':
id int(10) UNSIGNED
tytul text
tresc text
woj tinyint(3)
miasto varchar(255)
data_wprowadzenia date
termin_waznosci datetime
indeksy: id (UNIQUE), data_wprowadzenia, woj, termin_waznosci (INDEX)

struktura 'woj':
id tinyint(3)
nazwa varchar(255)
indeks: id (UNIQUE)


Dane pobieram zapytaniem:
  1. SELECT DISTINCT SQL_CALC_FOUND_ROWS t1.*,t2.nazwa
  2. FROM informacje
  3. AS t1, woj AS t2 WHERE t1.woj=t2.id ORDER BY t1.id DESC LIMIT 0, 15


czasem wykonanie zapytania trwa nawet 30-40 sekund (IMG:http://forum.php.pl/style_emoticons/default/sad.gif)

Jak takie coś przyspieszyć żeby mogło funkcjonować w warunkach strony www - wiadomo, musi się jakoś rozsądnie wczytywać.

P.S. Przy wykonywaniu bardziej skomplikowanych zapytań (gdzie dochodzą jeszcze np. kategorie informacji, daty, terminy, dających mniej rekordów w odpowiedzi, wczytuje się dużo szybciej)

P.P.S.: ... a wogóle jak dużo rekordów pomieśli tabela MySQLa, bo może jestem przy wartości granicznej czy co...:/ ?

pozdro
Alek
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Alek
post
Post #2





Grupa: Zarejestrowani
Postów: 47
Pomógł: 0
Dołączył: 25.06.2003
Skąd: Gdynia

Ostrzeżenie: (0%)
-----


@SongoQ

1. i 2. adlaczego unique jest wolniejszy od primary? pytam w celach dydaktycznych (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
3. chodzi o to zeby zrobić dodatkową tabelę (powiedzmy info_woj) zawierającą pary informacja - województwo?
czy to nie będzie wolniejsze (do joina dojdzie tabela relacji); poza tym to jest relacja *->1, więc nie wiem czy potrzebna dodatkowa tabela


@orson
Cytat
wywal SQL_CALC_FOUND_ROWS

SQL_CALC_FOUND_ROWS potrzebne mi jest do wydobycia info dla użytkownika i do stronicowania wyników - jaka jest alternatywa? (count(id) (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) )

Cytat
wywal DISTINCT

tu faktycznie nie jest potrzebne, jest to pozostałość z większej kwerendy, gdzie używałem jeszcze kategorii informacji w relacji *->* (tabela informacje_kat)
oto ona:
  1. SELECT DISTINCT SQL_CALC_FOUND_ROWS t1.*,t2.nazwa
  2.  
  3. FROM informacje
  4. AS t1, woj AS t2, informacje_kat AS t3
  5. WHERE t1.woj=t2.id AND t1.id=t3.informacja AND t3.kat='1'
  6. ORDER BY t1.id DESC LIMIT 0, 15


stąd nie mogę wywalić, bo będą się powtarzać wiersze wynikowe; chyba że można coś z tym zrobić...


@TomASS
Cytat
Zapytanie czy wyświetlenie wyników trwa 30-40 sekund. Napisałeś że wykonanie, jednak wolę się upewnić

zapytanie, czas podany przez phpMyAdmin

Cytat
Możesz pomyśleć o cachowaniu danych.

Serwer MySQL ustawiony ma cache wewnętrzny, więc następne identyczne zapytania są wykonywane szybko; poza tym tablica się dość szybko zmienia (co kilka minut)

-------------
poniżej wynik EXPLAIN:

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL woj NULL NULL NULL 55224 Using filesort
1 SIMPLE t2 eq_ref id id 1 mojabaza.t1.woj 1
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 12.10.2025 - 23:26