Показникові відмов потрібен один біт, а не трекер
До 28 серпня цей сайт не показував показника відмов, а сторінка «про нас» казала, що це навмисно: знадобився б сеанс, відстежуваний через кілька переглядів, а для нього — банер згоди.
Перша половина була правдою. Друга перестала нею бути тієї миті, коли ми почали записувати сторінки виходу, і ніхто не виправив фразу.
Чому його не можна було просто обчислити
Є таблиця переходів зі сторінки на сторінку. Вона виглядає як усе, що потрібно показникові відмов: візит, який іде з однієї сторінки на іншу, не відмова, отже рахуй візити без переходу.
Так не виходить, і причина стоїть у трьох рядках коду, що записує. Перехід відкидається, коли обидві сторінки та сама, коли між ними минуло понад тридцять хвилин, і після трьохсот нових пар на одному лічильнику за день. Кожне правило слушне для того, навіщо ця таблиця потрібна — показати, яка сторінка веде до якої, — і кожне робить справжню другу сторінку невидимою.
А візит, щоб його порахувати, триває годину: стільки живе рядок у живій таблиці. Чисельник і знаменник користувалися б двома різними поняттями візиту. Число вийшло б не трохи хибним, воно вийшло б ні до чого не прив’язаним.
Що дані все ж сказали
27 і 28 серпня було 8 669 візитів і 2 817 переходів, тобто в середньому 1,32 сторінки на візит. 99 лічильників із 572 записали бодай один перехід.
Це не вимкнений перемикач: запис шляхів типово ввімкнено, і в усіх 166 453 лічильників він увімкнений. Ці сайти справді односторінкові: профілі, поодинокі сторінки, галерея на чужому майданчику. Показник відмов у більшості буде близький до ста відсотків, і це буде правдою.
Один біт і жодного нового збирання
У візита й так є рядок на годину. Тепер він несе ще одне: чи бачив цей візит колись другу, іншу сторінку. Значення ставиться всередині команди, яка виконується в будь-якому разі, без додаткового запиту:
ON DUPLICATE KEY UPDATE mehr = mehr | (url <> VALUES(url)),
last_seen = UNIX_TIMESTAMP(), url = VALUES(url)
Порядок цих присвоєнь — уся хитрість. База обчислює їх зліва направо, тому url у мить порівняння ще тримає попередню адресу. Поставте url наперед — і рядок порівняє нову адресу саму з собою, біт назавжди лишиться нулем, а показник відмов покаже всім сто відсотків. Це збій, який виглядає точнісінько як правдоподібний результат, і тому варто було довести його на викидному рядку, перш ніж йому вірити.
Коли година минула, нічне прибирання рахує рядки, що спливають — скільки візитів, скільки з них багатосторінкових, — пише один рядок на лічильник і день та видаляє їх. Біт живе годину. Жодних cookie й нічого, що його переживе.
Що тут узагальнюється
Цікаве питання ніколи не полягало в тому, як відстежити сеанс. Воно полягало в тому, що з уже записуваного випадково відповідає на питання — і чи прив’язана відповідь до того самого поняття, що й питання.
Два джерела, обидва ніби міряють візити, одне з правилом на тридцять хвилин, друге на шістдесят, дадуть відношення, яке є числом і не значить нічого. Дешевше додати один біт до рядка, який і так є, ніж потім пояснювати, чому частка така, яка є.