![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 173 Pomógł: 1 Dołączył: 4.05.2010 Ostrzeżenie: (20%) ![]() ![]() |
Witam,
Mamy na aukcje.fm na dole panel losujący aukcje użytkownika lecz poprzez ORDER BY RAND( ) praca jest powolna i ogólnie obciąża serwer głównie gdy użytkownik ma ponad 100K aukcji i wchodzi bot + ruch ludzi. W procesie sql to ciągle to samo zapytanie SELECT * FROM `tabela1` WHERE `user` = "200" AND `closed` =0 AND `suspended` =0 ORDER BY RAND( ) Kod php
Jak można np. dać losowanie szybsze lub nie z pośród całości 100K rekordów lecz z np 200 rekordów od numeru ID aktualnej aukcji. Lub jest inny sposób? |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 590 Pomógł: 185 Dołączył: 19.04.2006 Skąd: Gdańsk Ostrzeżenie: (0%) ![]() ![]() |
Też było kilka takich tematów. Moim zdaniem warte uwagi jest:
1. "przycięcie" tabeli, czyli ograniczamy (poprzez where, podzapytanie, warunek w join, dodatkową tabelę, dodatkowe pole tabeli) liczbę rekordów do losowania, ograniczenie także może być losowe (np. raz losujemy parzyste rekordy, innym razem nieparzyste, zyskujemy 50%) 2. buforowanie, nawet jeśli wynik losowania ma się zmieniać co każdy refresh to nie musimy losować ciągle z całej tabeli, tylko z wcześniej pobranej, mniejszej jej części (np. w folderze usera tworzymy plik random_auctions i trzymamy tam 100 losowych ID aukcji z których losujemy 10, plik odświeżamy co X czasu) 3. tworzenie szybkich tabel pomocnicznych (memory), stworzymy sobie tabele rand_user, która zawiera tylko zaindeksowane id_aukcji dla jednego usera, teraz losować już szybciej się nie da 4. zrezygnowanie z "order by rand" na rzecz innych algorytmów, pomysłowość ludzka jest tu wprost nieograniczona, mamy pobrać np. 3 losowe więc tworzymy zapytanie: - gdzie liczby w IN są losowane w PHP na podstawie liczby rekordów. Przy odrobinie szczęścia znajdziemy 3 rekordy a jeśli nie to zapytanie ma się wykonać jeszcze raz (aż do skutku) - będzie chyba szybsze niż "order by rand"? Można też dawać rekordom numer kolejny (bez dziur), numerowanie wykonywać w tle co jakiś czas - jest to rozwiązanie szybkie a wylosowanie X numerów da nam z bazy X wyników. (IMG:style_emoticons/default/guitar.gif) (IMG:style_emoticons/default/dry.gif) Ten post edytował Pilsener 17.12.2010, 21:46:18 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 8.10.2025 - 09:58 |