Notice: query (INSERT INTO lemat_stats_browser (day,browser,ilosc,internal) VALUES ('2024-11-21','Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)',1,'2')) failed at /home/lemat/lemat.priv.pl/stats.php:151: Array ( [0] => 22001 [1] => 1406 [2] => Data too long for column 'browser' at row 1 ) in /home/lemat/lemat.priv.pl/panel_adm/dbclass.inc.php on line 15

Warning: Cannot modify header information - headers already sent by (output started at /home/lemat/lemat.priv.pl/panel_adm/dbclass.inc.php:15) in /home/lemat/lemat.priv.pl/stats.php on line 174
Optymalizacja - Lemat, strona prywatna
Lemat, strona prywatna

Optymalizacja jest ważna

Okazuje się, że nawet ja mogę spartolić prostą rzecz. Zrobiłem niedawno statystyki - "ilość osób na stronie" - w bardzo prosty sposób:

CREATE TABLE `_stats` (
  `data` timestamp(14) NOT NULL,
  `ip` varchar(20) NOT NULL default '',
  UNIQUE KEY `ip` (`ip`),
  KEY `data` (`data`)
) TYPE=MyISAM;

REPLACE INTO _stats VALUES (NOW(),'$ip')
SELECT count(*) as ILE FROM _stats WHERE data+1500 > now()
DELETE FROM _stats WHERE TO_DAYS(data)+2 < TO_DAYS(now())

czyli trzymałem w tabeli SQL numery IP, liczba osób na stronie = liczba ipków, które odwiedziły stronę w ciągu ostatnich 1500 sekund. Jak widać w tabeli były trzymane IPki z ostatnich 2 dni. Zrobiłem to na szybko, nie przykładając zbytniej wagi do problemu.

Aż tu nagle okazało się, że przy 70 userach "na stronie" serwer MySQL kopnął w kalendarz. Tabela _stats się uszkodziła, klient obiecywał mi rozkosze smażenia w smole...

Poprawiłem kod na:

REPLACE INTO _stats VALUES (NOW(),'$ip')
DELETE FROM _stats WHERE data+1500 < now()
SELECT count(*) as ILE FROM _stats

I od tej pory wszystko hula jak należy. Różnica jest taka, że w tabeli jest mniej rekordów, zamiast 3000 jest około 70 (zależy oczywiście od pory dnia).
Oprócz tego silnik bazy danych nie mieli niepotrzebnie dwa razy całej tabeli w poszukiwaniu rekordów "starszych/młodszych niż" i nie robi niepotrzebnych obliczeń przy funkcji TO_DAYS().

Jak widać na powyższym przykładzie diabeł tkwi w szczegółach i trzeba na nie zwracać uwagę, a nie robić "byle szybko".

Na domiar złego, akurat przerwałem pracę przy swoich statystykach, przegrałem plik na serwer i jak wszedłem teraz, po godzinie walki z tym błędem to oczywiście wita mnie parse error... Czyżbym się już zestarzał?


Data utworzenia : 2003-12-23

Skomentuj ten tekst

Komentarze:

keczerad
2007-04-15 23:39:18
Programista nie przewidzi wszystkiego
od tego są testy i testerzy, ostatnio widoki musiałem zamienic na procedury skladujace. Widoki fajnie chodzily przy 10 tysiacach rekordow ale przy 500 tysiącach juz miały pod gorke.
nf
2006-12-30 00:39:12
[a]
No widzisz - NAWET Ty :-]
bobee
2006-02-24 10:16:13
Jak Lemat skrypt spartolił
ip liczy gateway'e a nie ludzikow, albo liczyc sesje albo ip i sesje
Odpowiedź Lemata:
nie można było zastosować cookiesów, bo strona ma wiele subdomen.
Kromek
2005-03-04 00:01:27
TEMAT: "Re: tabele SQL"
A... to mi zabiles teraz cwieka;) ale nadal bede twierdzic, za nie ma czego takiego jak "tabele SQL";)
Odpowiedź Lemata:
pewnie, że nie ma, można mówić o tabelach w bazie SQL, znaczy puryści językowi mogą tak mówić, ja sobie skracam a i tak wszyscy wiedzą o co chodzi.
Kromek
2005-03-03 23:47:12
tabela SQL ?
"tabeli SQL" To jest chyba jakis nowy i nie do konca poznany typ tabel? Slyszalem o MySQL, postgres i innych- ale tabele SQL??? A nawiasem mowiac strona www bardzo OK Pozdrawiam
Odpowiedź Lemata:
a ja słyszałem o serwerach baz danych mysql, postgress... i rzeczywiście, nie słyszałem nigdy o tabelach mysql... ;)
wszystkie opinie »
Protected by spf
[Nospam-PL.NET]
Seti@Home
www.php.net
© Lemat 2004 - ∞