Skocz do zawartości

Archiwum z Mysql


michal

Rekomendowane odpowiedzi

Potrzebuję zaktualizować skrypt obsługujący pewne archiwum i wydaje mi się to proste ale nie wpadłem na pomysł. Ilość rekordów w bazie w tej chwili już jest ponad 300 000 i troszeczkę za długo wykonuje zapytanie.

Żeby wylistować inikalne kombinacje 'miesiąc-rok' używam takiego zapytania:

$lista = mysql_query("SELECT DISTINCT EXTRACT(YEAR_MONTH FROM FROM_UNIXTIME(date)) from tab1 order by date");

To zapytanie jednak musi przejść przez wszystkie rekordy to przy takiej ilości rekordów jest według mnie zbyt obciążające.

Mogę pobrać datę pierwszego i ostatniego rekordu tak:

$range = mysql_query("(SELECT date from tab1 ORDER BY date ASC LIMIT 1) UNION (SELECT date from tab1 ORDER BY date DESC LIMIT 1)");

Pierwszy i ostatni rokord to:

$start = mysql_result($range,0);
$end = mysql_result($range,1);

Teraz pytanie.

Data jest w formacie unix_timestamp, jak zrobić listę unikalnych 'miesiąc-rok' pomiędzy $start i $end?

Odnośnik do komentarza
Udostępnij na innych stronach

Hmm...

Robiąc testy, widzę że zapytanie z DISTINCT wykonuje się 2.5 razy szybciej niż z UNION.

Przecież zapytanie z UNION musi przejść przez wszystkie rekordy dwukrotnie, więc logicznie będzie się wykonywało dłużej.

Tak więc teoria optymalizacji poprzez drugie zapytanie odpada.

Chyba pozostaje mi cache'ować obecne zapytanie i już.

Odnośnik do komentarza
Udostępnij na innych stronach

Nie wiem Michale czy znajdzie sie rozwiązanie w MySql (za słabo jeszcze znam).

Zrobiłbym tak:

Utworzyc dodatkowe pole (6cio znakowe) i wpisywac tam YYYYMM a potem wystarczy index UNIQUE !?

[edyta]

zrobiłem testy.. :D pisałem, że nie znam jeszcze MySql.. niestety tak się nie da !

Odnośnik do komentarza
Udostępnij na innych stronach

To też by nie działało dobrze, bo nowe rekordy są dodawane średnio co 5 minut. Index UNIQUE zwiększy ilość operacji i błędów przy dodawaniu.

W sumie to można o tym temacie zapomnieć, bo mogę cachować wynik zapytania na czas trwania aktualnego miesiąca i wykonywać je raz na miesiąc.

W chwili obecnej zapytanie jest wykonywane kilka razy na minutę i serwer sobie z tym radzi. Tak przezornie chciałem tylko zoptymalizować i dobrze że napisałem temat, bo wpadłem na cachowanie. :D

Odnośnik do komentarza
Udostępnij na innych stronach

Ja bym na twoim miejscu wykonał to zapytanie raz, następnie umieścił tą listę w osobnej tabeli i przy każdej modyfikacji modyfikowałbym także tą drugą tabelę. Tak więc jestem za rozwiązaniem z takim właśnie cache'owaniem wyników.

Dała matka rozum? To kombinuj.

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności