Подсчет количества ячеек с помощью php и mysql

Сделал разделение на читателей и авторов на сайте современной литературы руиздат. Слева в статистике сайта появилось две новых графы. Не так просто оказалось, как я сначала думал. Повозился и подумал я изрядно. База данных уже не такая уж и маленькая, а соответственно и все подсчеты в ней происходят куда медленней, чем в самом начале.

Пришлось даже в структуру базы данных mysql внести изменения. Еще надо переписывать кое-где код, так как уже много произведений и подсчет начинает затормаживать некоторые процессы до 2 секунд, в редких скриптах. Пока это не так критично, но это надо обязательно дорабатывать, так как через полгода это будет уже не две, а минимум 5 секунд, что уже является критичным. Хоть подсчет и производится в двух скриптах, но надо апгрейдить и переписать саму логику подсчета.

Когда я писал код подсчета авторов и читателей, то понял, что без дополнительной ячейки, где будет храниться количество произведений конкретного автора не обойтись. После внесения изменений в структуру БД, начался процесс разработки скрипта подсчета. Могу поделиться парой моментов, которые у меня вызвали трудности. До сих пор не могу понять как же можно каждый раз пересчитывать на лету, так как наблюдаются серьезные подвисания и php и sql, так как огромное количество операций за раз происходит.


Код подсчета на php, как его вижу я:

$resultautors = @mysql_query("SELECT ID,status FROM $autortable WHERE status = 'ok'");
$totalautors=@mysql_num_rows($resultautors);
// подсчет читателей и авторов
// ОТКЛЮЧАТЬ ОБЯЗАТЕЛЬНО! ЗАПУСКАТЬ ТОЛЬКО В СЛУЧАЕ ПОЛНОГО ОБНОВЛЕНИЯ. ВИСНЕТ

/* while ($come=mysql_fetch_array($resultautors)) {

// берем номер автора
$r1 = $come["ID"];

// узнаем сколько у него всего прозы
$texts = @mysql_query("SELECT aid FROM $textable WHERE aid = '$r1'");
$schet = @mysql_num_rows($texts);
$podschetprozi = @mysql_query("update $autortable SET proiz=$schet WHERE ID=$r1");

// узнаем сколько у него всего стихов

$stihi = @mysql_query("SELECT aid FROM $textablestihi WHERE aid = '$r1'");
$schet2 = @mysql_num_rows($stihi);
$podschetstihi = @mysql_query("update $autortable SET proiz=proiz+$schet2 WHERE ID=$r1");

} */

Так как раньше в структуре базы нигде не хранились данные о количестве произведений у конкретного автора(каждой раз данные конкретному аккаунту подсчитывались, а не считывались напрямую из ячейки), то пришлось один раз этим скриптом все подсчитать и каждому записать. Чтобы поддерживать данные в актуальном состоянии и каждый раз не пересчитывать, я сделал обновление ячеек у автора в случае если он добавил новую прозу или стих, а также в случае их удаления. Скрипт либо плюсует, либо вычитает, чего достаточно для поддержания минимальной актуальности данных.

Проблема некритичная, но не понимаю, как еще ускорить скрипт подсчета, чтобы подсчет происходил не за 5 секунд, а за доли секунды. Вроде бы и так уже по минимуму возможных подсчетов, как снизить еще не знаю пока. Все по необходимости, только так и больше никак. Пробовал через массивы, там еще дольше чем с помощью функции mysql_num_rows.


Вывод записанных данных и небольшой подсчет производит следующий скрипт:

$autors = @mysql_query("SELECT ID,status,proiz FROM $autortable WHERE proiz > '0'");
$writers = @mysql_num_rows($autors);

$totalreaders = $totalautors - $writers;
$procent = ($writers/$totalautors) * 100;
$procent = round($procent, 1);

// вывод данных

echo "Всего авторов: $totalautors<br/>";
echo "Всего разместились: $writers<br/>";
echo "Всего читателей: $totalreaders<br/><br/>";
echo "Процент конвертации: $procent %</center>";

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

Как это выглядит на сайте руиздата:
Подсчет читателей и авторов

Когда год назад, начинался этот проект с литературным сайтом, я прекрасно понимал, что когда-нибудь придет время полностью переписывать множество скриптов, но так как движок изначально был мягко скажем далек от идеала, а новые функции вводились постоянно на протяжении всего года, сайт начал заметно обрастать сложностями в его доработке. Авторов пока немного и все скрипты работают достаточно слаженно и шустро, но когда количество авторов перевалит за 5000 думаю будут серьезные сложности и нужно будет что-то кардинально менять.

Если проект к тому времени не начнет себе хотя бы хостинг окупать, то может быть еще сложней. Пока это все в будущем, но думать об этом приходится и сейчас, так как вложено в ресурс уже много времени, труда и много чего еще. Посещаемость пока достаточна, для того чтобы скрипты не затормаживались, но когда она вырастет хотя бы до 1000 в час, они уже точно справляться не будут. К тому времени все должно начать приносить деньги :)

Мы верим в то, что наша работа не напрасна и на этой позитивной ноте я поздравляю вас с наступающим новым 2016 годом, желаю успехов в делах, здоровья и всего самого наилучшего. С наступающим!

Добавить комментарий


Защитный код
Обновить

Еще информация на эту тему:
Топ 10 записей в блоге: