Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zakres dat z danych
Forum PHP.pl > Forum > Bazy danych > MySQL
wlamywacz
Witam

Struktura tabeli:
  1. CREATE TABLE IF NOT EXISTS `status` (
  2. `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `pageid` bigint(20) UNSIGNED NOT NULL,
  4. `date` datetime NOT NULL,
  5. `server` tinyint(1) UNSIGNED NOT NULL,
  6. `php` tinyint(1) UNSIGNED NOT NULL,
  7. UNIQUE KEY `id` (`id`),
  8. KEY `pageid` (`pageid`,`date`)

Przykładowe dane:
  1. INSERT INTO `status` (`id`, `pageid`, `date`, `server`, `php`) VALUES(1, 1, '2010-06-24 22:43:52', 1, 1);
  2. INSERT INTO `status` (`id`, `pageid`, `date`, `server`, `php`) VALUES(2, 1, '2010-06-24 22:44:52', 1, 0);
  3. INSERT INTO `status` (`id`, `pageid`, `date`, `server`, `php`) VALUES(4, 1, '2010-06-24 22:45:53', 1, 0);
  4. INSERT INTO `status` (`id`, `pageid`, `date`, `server`, `php`) VALUES(5, 1, '2010-06-24 22:46:53', 1, 0);
  5. INSERT INTO `status` (`id`, `pageid`, `date`, `server`, `php`) VALUES(6, 1, '2010-06-24 22:47:53', 1, 1);
  6. INSERT INTO `status` (`id`, `pageid`, `date`, `server`, `php`) VALUES(7, 1, '2010-06-24 22:48:53', 1, 1);
  7. INSERT INTO `status` (`id`, `pageid`, `date`, `server`, `php`) VALUES(8, 1, '2010-06-24 22:49:53', 1, 1);
  8. INSERT INTO `status` (`id`, `pageid`, `date`, `server`, `php`) VALUES(9, 1, '2010-06-24 22:50:53', 1, 0);

Czy istnieje optymalny sposób aby na poziomie bazy danych wyciągnąć informacje o okresach w których wystąpił błąd php. Czyli coś w rodzaju:
Od 2010-06-24 22:44:52 do 2010-06-24 22:46:53, od 22:50:53 do 22:50:53 wystąpił błąd.

Pozdrawiam.
mkozak
Ola boga, co za 'crazy idea'.

Po to są pliki logów. Błędy loguje server do pliku, pliki logów po jednym na dzień, a potem 'grep'-ujesz pliki w poszukiwaniu tego co ci potrzeba.
Taki sposób jest najszybszy/wydajniejszy. (może mało elastyczny, ale do tego właśnie stworzony)

w żaden sposób twój pomysł nie jest wydajny.

Ale jeżeli już to:
1. Make your database as small as possible to better fit in memory - czyli staraj się o jak największe "upakowanie" danych, żeby zoptymalizować proces przeszukiwania tabeli.
Czy na polu pageid potrzebujesz, aż biginta, czy wystarczy ci zakres od 0-128? Zmniejsz o ile się da.
2. Ustaw 'ROW_FORMAT' tabeli na FIXED - zobaczysz sobie w phpmyadminie na zakładce operacje. Odchudzi to strukturę pliku danych.
3. Jeżeli będziesz przeszukiwał to korzystaj z całego klucza (SELECT * FROM logi WHERE pageid= x AND data between '2010-01-01' and '2005-01-31')
4. Włącz pakowanie kluczy. Też w opcjach tabeli. Zmniejszy to klucze i jeżeli się nie mylę to przy dużych ilościach powinno ładniej pasować w pamięć serva. Przyspieszy wyszukiwanie.

Osobiście ja bym zamienił datetime na intiger i ładował tam unix time stampy (ilość sec od 1970).
Wtedy łatwiej jest robić działania na tym polu (dodawanie i odejmowanie dowolnej ilości sec) SELECT * FROM logi WHERE pageid= x AND data between 1277804192 and 1277804192+3600;
wlamywacz
Nie ma takiej możliwości niestety gdyż dziennie mogło by przybywać nawet z 1k plików. Ilość rekordów w tabeli będzie bardzo duża (100k dodawanych codziennie). Rozwiązałem to w inny sposób.
mkozak
Nie jeden plik na jeden błąd tylko jeden plik na dzień.
Więc jeden plik dziennie ze wszystkimi błędami.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.