Współczynnik odrzuceń potrzebuje jednego bitu, nie trackera
Do 28 sierpnia ta strona nie pokazywała współczynnika odrzuceń, a strona „o nas" mówiła, że to celowo: wymagałby sesji śledzonej przez kilka odsłon, a to wymagałoby banera zgody.
Pierwsza połowa była prawdą. Druga przestała nią być w chwili, gdy zaczęliśmy zapisywać strony wyjścia, i nikt tego zdania nie poprawił.
Dlaczego nie dało się go po prostu wyliczyć
Jest tabela przejść ze strony na stronę. Wygląda na wszystko, czego współczynnik odrzuceń potrzebuje: wizyta, która idzie z jednej strony na drugą, nie jest odrzuceniem, więc policz wizyty bez przejścia.
To nie działa, a powód stoi w trzech wierszach zapisującego kodu. Przejście przepada, gdy obie strony są tą samą, gdy między nimi minęło więcej niż trzydzieści minut, i po trzystu nowych parach na jednym liczniku w jednym dniu. Każda reguła jest słuszna dla tego, po co ta tabela jest — pokazywać, która strona prowadzi do której — i każda czyni prawdziwą drugą stronę niewidoczną.
Tymczasem wizyta, jeśli chcemy ją policzyć, trwa godzinę: tyle żyje wiersz w tabeli na żywo. Licznik i mianownik używałyby więc dwóch różnych pojęć wizyty. Liczba nie byłaby lekko błędna, byłaby bez zaczepienia.
Co dane jednak powiedziały
27 i 28 sierpnia było 8 669 wizyt i 2 817 przejść, czyli średnio 1,32 strony na wizytę. 99 z 572 liczników odnotowało w ogóle jakieś przejście.
To nie jest wyłączony przełącznik — zapisywanie ścieżek jest domyślnie włączone i przy wszystkich 166 453 licznikach stoi na włączone. Te strony naprawdę są jednostronicowe: profile, strony wizytówki, galeria na czyjejś platformie. Współczynnik odrzuceń dla większości z nich wyjdzie blisko stu procent i będzie to prawda.
Jeden bit i żadnego nowego zbierania
Wizyta i tak ma przez godzinę swój wiersz. Niesie teraz jedną rzecz więcej: czy ta wizyta widziała kiedykolwiek drugą, inną stronę. Wartość ustawia się w poleceniu, które i tak się wykonuje, bez dodatkowego zapytania:
ON DUPLICATE KEY UPDATE mehr = mehr | (url <> VALUES(url)),
last_seen = UNIX_TIMESTAMP(), url = VALUES(url)
Kolejność tych przypisań to cała sztuczka. Baza wylicza je od lewej do prawej, więc url w chwili porównania trzyma jeszcze poprzedni adres. Postaw url na początku, a wiersz porówna nowy adres sam ze sobą, bit zostanie na zawsze zerem, a współczynnik odrzuceń pokaże wszystkim sto procent. To awaria, która wygląda dokładnie jak wiarygodny wynik — dlatego warto było udowodnić rzecz na wierszu na wyrzucenie, zanim się jej uwierzy.
Gdy godzina minie, nocne sprzątanie liczy wygasające wiersze — ile wizyt, ile z nich wielostronicowych — zapisuje jeden wiersz na licznik i dzień i kasuje je. Bit żyje godzinę. Żadnego ciasteczka i niczego, co by ją przetrwało.
Co się uogólnia
Ciekawe pytanie nigdy nie brzmiało, jak śledzić sesję. Brzmiało: która z rzeczy, które i tak zapisujemy, przypadkiem odpowiada na to pytanie — i czy odpowiedź jest przywiązana do tego samego pojęcia co pytanie.
Dwa źródła, które oba wyglądają, jakby liczyły wizyty, jedno z regułą trzydziestu minut, drugie z regułą sześćdziesięciu, dadzą stosunek, który jest liczbą i nic nie znaczy. Łatwiej dołożyć jeden bit do wiersza, który już istnieje, niż tłumaczyć później, dlaczego wskaźnik jest taki, jaki jest.