Самый эффективный способ хранения ежедневных просмотров страниц, а также общего количества

Существует много дискуссий о сохранении просмотров страниц для статьи или видео в базе данных, но я не могу найти никакой информации о сохранении ежедневных просмотров страниц. Например, DeviantArt показывает последние 15 или около того дней и количество просмотров страниц, которые каждый из них получил, на небольшом графике, а также общее количество просмотров страниц для профиля.

Пример просмотров страниц

Вы можете видеть выше, чего именно я пытаюсь достичь, и DeviantArt делает это в огромных масштабах, поскольку они получают миллионы просмотров.

Я использую CodeIgniter на PHP и MySQL.


person Adam    schedule 01.12.2012    source источник
comment
Я обновил свой ответ. Из любопытства, что это за сайт? Я удивлен, что вы ожидаете миллионы посещений в день.   -  person Marvin    schedule 01.12.2012
comment
Это в основном из интереса, мне не нужно будет использовать такой скрипт прямо сейчас, но я начинаю работать над некоторыми более крупными сайтами, поэтому, вероятно, он мне понадобится в будущем :)   -  person Adam    schedule 01.12.2012


Ответы (3)


У вас может быть строка для каждого дня, а затем увеличивать счетчик при просмотре.

INSERT INTO views (day,views) VALUES (CURDATE(),1) ON DUPLICATE KEY UPDATE views=views+1;

И PHP-скрипт...

mysql_query("INSERT INTO views (day,views) VALUES (CURDATE(),1) ON DUPLICATE KEY UPDATE views=views+1;");

При этом используется таблица под названием «просмотры» и 2 строки «день» и «просмотры».

Дополнительные сведения см. в этой статье.

person Rob Farr    schedule 01.12.2012

Обычно в этих случаях вы делаете таблицу регистрации с 1 записью на представление. У вас есть cron, запускаемый через определенные промежутки времени (ежедневно), чтобы суммировать данные регистрации в другую сводную таблицу. На самом базовом уровне у вас будет 1 запись в день в сводной таблице с общим количеством просмотров. Поскольку исторические данные никогда не меняются, вам не нужно делать обновления. Это дает вам не более 365 записей на элемент в год. Записей не много, поэтому хорошо масштабируется.

Это лучше масштабируется, чем наличие одной записи на каждый день и обновление счетчика. Вы можете столкнуться с проблемами соперничества/блокировки, если пытаетесь обновить одну и ту же запись несколько раз. Выполняя INSERT DELAYED и используя таблицу MyISAM, ваша таблица регистрации может очень хорошо масштабироваться.

Затем вы можете выбрать из сводной таблицы, чтобы получить ежедневные подсчеты, и вы можете выбрать из таблицы регистрации, если вы хотите отобразить текущий подсчет дней.

Если вы хотите, чтобы ваша таблица журналов была небольшой, при запуске cron вы можете переименовать таблицу журналов и создать новую, пустую. Затем обработайте переименованную таблицу регистрации.

RENAME TABLE logging TO logging_old;CREATE TABLE logging LIKE logging_old;

Если вам действительно нужно масштабирование, вы можете использовать прием репликации, чтобы очень быстро регистрировать просмотры. Вы используете тип таблицы BLACK HOLE для регистрации данных, которые реплицируются на другой сервер, где используется таблица MyISAM или InnoDB.

person Brent Baisley    schedule 01.12.2012

Я не использую codeIgniter, но вот как вы можете сделать это прямо на php.

По сути, вы можете либо использовать сеансы для записи каждого посещения вашего сайта и записи запросов их страниц, либо вы можете просто записывать каждое посещение страницы. Первый вариант дает вам больше информации (сколько уникальных обращений было сделано, сколько обращений от вернувшихся посетителей и т. д.), но требует больше программирования для настройки и требует управления сеансом пользователя. Итак, для ваших целей я объясню вариант 2.

SQL:

Table 'pageViews'
Id  - Integer, auto Increment, primary key
page - varchar(150)
datetime - datetime

На странице, которую вы отслеживаете, вы должны добавить:

    $query2 = "INSERT INTO `pageViews` (page, datetime) VALUES ('".$_SERVER["SCRIPT_NAME"]."', ".date("Y-M-d H:I:s").")";
    $result2 = //insert DB connection etc. to apply update to DB

Затем вы можете извлекать строки из базы данных на основе страницы и отметки даты и времени, подсчитывать результаты и отображать их с помощью холста html5. Или, поскольку у каждого обращения есть дата и время, вы можете разбить его на часы дня и т. д.

Надеюсь, это поможет.


Чтобы изменить это для простых ежедневных счетчиков, добавьте дополнительный столбец под названием «просмотры», который является просто целым числом. Затем на странице поставьте галочку, чтобы увидеть, есть ли строка для текущей страницы на сегодняшний день в БД. Если это так, то получите текущее значение просмотров, увеличьте его и перепродайте в БД.

Для общего количества просмотров я бы, вероятно, создал еще одну таблицу с теми же столбцами, но без столбца даты и времени. Затем на своей странице вы также увеличиваете значение просмотров для текущей страницы в новой таблице.

Это было бы молниеносно. Компромисс — потеря деталей. Итак, вот MySQL и PHP для этого третьего варианта:

MySQL:

Table 'dailyViews'
Id  - Integer, auto Increment, primary key
views - integer
page - varchar(150)
datetime - datetime

Table 'totalViews'
Id  - Integer, auto Increment, primary key
views - integer
page - varchar(150)

PHP:

// Search the DB for an entry today for this page in dailyViews
$query = "SELECT views FROM `dailyViews` WHERE `page`='".$_SERVER["SCRIPT_NAME"]."' AND `datetime`=".date("Y-M-d H:I:s")."";
$result = //insert your db connection etc to execute the query

if (mysqli_num_rows($result)==1) {
    $resultArray = mysqli_fetch_array($result, MYSQLI_ASSOC);
    $views = $resultArray['views']+1;
    $query2 = "UPDATE `dailyViews` SET `views`=".$views." WHERE `page`='".$_SERVER["SCRIPT_NAME"]."' AND `datetime`=".date("Y-M-d H:I:s")."";
    $result2 = //insert DB connection etc. to apply update to DB
} else if (mysqli_num_rows($result)<1) {
    $query2 = "INSERT INTO `dailyViews` (views, page, datetime) VALUES (1, '".$_SERVER["SCRIPT_NAME"]."', ".date("Y-M-d H:I:s").")";
    $result2 = //insert DB connection etc. to apply update to DB
} else {
    // there is more than one entry for this page and date in the DB. An error has ccurred
}

// Then just get the total views for this page and increase it by 1.
person Marvin    schedule 01.12.2012
comment
То есть вы хотите создать новую строку для каждого просмотра страницы? Не будет ли это очень медленным на огромном сайте с миллионами посещений в день? - person Adam; 01.12.2012
comment
Это зависит от сайта, но если это не миллионы посещений в день, то, как правило, нет. Строки очень маленькие с точки зрения байтов, поэтому ответ очень быстрый. Предложенный мной метод легко расширить, чтобы получить больше информации о просмотрах страниц (например, разбить их на количество просмотров в час). Я могу добавить простой ежедневный счетчик, если хотите. - person Marvin; 01.12.2012