[mysql] Optymalizacja zapytania

0

Witam,

Mam zapytanie do bazy:
SELECT * FROM files ORDER BY views DESC LIMIT 9

i to zapytanie wykonuje sie niestety prawie 1 sek powodując obciążenie bazy. Baza liczy 350 000 rekordów, typ MyISAM, strona na której wykonuje się to zapytanie ma ok 15 000 UU/dzień (~ 150 000 odsłon)

Jednak 1 sek to chyba b. dużo jak na takie zapytanie... można temu jakoś zaradzić?

0

Czy musisz na bieżąco mieć te statystyki? Jeśli nie to proponowałbym, żeby zrobić dodatkową tabelę do ktorej będziesz wrzucać informacje o tych najbardziej popularnych plikach. Strukturę może mieć nawet taką samą jak files. Co godzinę możesz odpalać jakiś programik czy skrypt który przejrzy tabelę files, skasuje dane z dodatkowej tabeli i wypełni je aktualnymi. A do strony będziesz brać dane z tej dodatkowej tabeli.

0

W tym query sortujesz dane, a więc wzrost wydajności uzyskasz jeśli będziesz posiadał dane już posortowane. Z samego zapytanie niewiele wynika, ale możesz rozważyć następujące case'y:

  1. Clustered index na kolumnie views (chyba, że masz już zdefiniowany Primary Key na tej tabelce)

  2. Nowa tabelka z clustered index na views, z której będziesz wybierał tylko np. 9 interesujących Cie elementów i łączył z istniejącą tabelką po kolumnie views. Do tego index na kolumnę views.

pzdr,
yarel

0

Dane nie są potrzebne mi online cały czas - nie zmieniają się często więc wybrałem sposób z cachem i ich odświeżanie raz dziennie (chyba optymalniej się nie dało ;) )

Na tabele mam juz załozone indexy:
1 PK
1 UNIQUE
1 FULLTEXT

views nie ma żadnego bo to liczba odsłon pliku.

0

Ok. Złe podejście. Niewiele tu zoptymalizujesz, ale można trochę inaczej podejść do problemu. Za każdym pobraniem pliku aktualizujesz kolumnę views. Dodaj dodatkową statystyczną tabelę, która będzie zawierała takie dane:

  • id pliku FK
  • ilość pobrań

i w momencie gdy potrzebujesz statystyki wybierasz tylko z 9 rekordów + wykonujesz łączenie po FK z tabelką Files. będzie szybciej bo masz szukanie po kluczu BEZ sortowania 350k rekordów, a tylko 9. Teraz jak ktoś pobiera plik to będziesz sprawdzał czy plik łapie się na listę i podmieniał tylko ID pliku i ilość pobrań.

1 użytkowników online, w tym zalogowanych: 0, gości: 1