Различен ефективен брой

Изборът на броя на уникалните стойности за определен период от време не е много често срещана задача. В .io трябва да определим броя на уникалните потребители, посещаващи сайта за всеки период от време.

Разбира се, има много просто обикновено SQL решение. Достатъчно е да запазите уникални потребителски идентификатори и времето за влизане в проста таблица:

Тогава решението ще изглежда така:

# Отделен избор на обикновен брой в Mysql

Това решение обаче е доста бавно дори на малки маси (милиони записи).

# Много бавно и това са 2,5 милиона записа в таблицата

Общият брой на публиката, за която вярваме, е около 50 милиона души на ден, така че това не ни устройваше.

MySQL и преброяване (различно)

Mysql не е много подходящ за решаване на проблеми. Но си струваше да опитам. За да накарате всичко да работи по-бързо, можете да направите няколко оптимизации.

1. Правилен индекс

Mysql пак ще сканира всички редове от заявката, за да намери уникални идентификатори. Графата време ще ви помогне да ги намалите значително. Следователно трябва да отиде първо в индекса:

2. Квант време

В нашия случай минималният период от време за отчитане на стойности не може да бъде по-малък от един ден. Няма смисъл да запазвате повече от един запис за всеки потребител в един ден. Така че трябва да се направи времевата колона тип дата и сложи уникален индекс:

# Часовата колона е от тип дата, сега всеки ден ще има само един запис с уникален идентификатор

Вертика и преброяване (различно)

Тази векторна база данни е добре оптимизирана за съвкупно вземане на проби. Преброяването на количеството през избрания интервал от време обаче работи само 2-3 пъти по-бързо от Mysql.

# Малко по-бързо от Mysql

приблизителен_ брой_различен ()

Vertica поддържа агрегирана функция приблизителен_ брой_различен (), което отчита приблизително броя на уникалните стойности. Той работи с порядък по-бързо от обикновената заявка, но има грешка от около 1%:

Redis и HyperLogLog

Redis има специално предназначение за съхранение HyperLogLog. Тя ви позволява да съхранявате ключове там и след това да получавате броя на уникалните ключове в този магазин. Ограничението е, че списъкът на съхранените ключове не може да бъде получен. Предимството е, че едно такова хранилище отнема само 12 KB, е в състояние да съхранява 2 64 елемента и връща резултата с грешка от само 0,8%.

Устройство HyperLogLog

HyperLogLog е вероятностен алгоритъм за преброяване на уникални елементи.

Принципът на алгоритъма може да бъде обяснен с прост пример от живота. Представете си, че хвърляте монета от известно време, като броите броя на непрекъснатите последователни глави. Ако завършите с поредица, която е само 3 глави подред, тогава можем да предположим, че не сте хвърляли монета много дълго. От друга страна, ако сте ударили 15, тогава вероятно сте прекарали по-голямата част от деня.

Но ако имате късмет и за първи път получите последователност от 10 глави, след което сте спрели това безсмислено упражнение, тогава приблизителната преценка за прекараното време ще бъде изключително погрешна. За да увеличите точността на сближаването, ще трябва да повторите експеримента, но този път използвайте 10 монети и 10 листа хартия, на които ще запишете най-дългите последователности от опашки. По този начин преценката на прекараното време ще бъде много по-точна.