Simba, Как это? Сам то читал что написал?
# kantry (06.10.2019 / 09:23)
Simba, Как это? Сам то читал что написал?
Читал гг. Ну, а что тебе не понятно?
На форуме решена конкретная проблема - производительность при большом количестве данных.
На малом количестве данных он нормально работает.
Simba, Теперь ясно
Мужики зачем вам зайца ловить, если в магазине есть ролтон
п.с. мАКС, Я СЕЙЧАС ОТ СМЕХА ПОМРУ НАВЕРНО.
На большой базе форума возникают заметные тормоза.
Плохо работает часть запроса `cms_forum_rdm`.`topic_id` Is Null
Пробовал манипулировать с индексами, не помогает, пробовал NOT IN и NOT EXISTS еще хуже...
Кроме того, в таблице cms_forum_rdm очень большое к-во записей, которое равно (к-во тем Х к-во пользователей).
Причем систематизация таблиц (разбивка форума на категории-темы-посты) помогает мало, тормозит именно cms_forum_rdm при нуль-запросе.
Если из запроса списка новых тем удалить `cms_forum_rdm`.`topic_id` Is Null, сразу работает во много раз быстрее, обновленные темы показывает правильно. Но не показывает новые темы.
---
Я вчера придумал новый алгоритм расчета непрочитанных, надо будет проэкспериментировать.
Если идея была верной, позволит на несколько порядков поднять скорость, уменьшить базу непрочитанного и снизить нагрузку.
# AlkatraZ (16.10.2019 / 13:19)
Я вчера придумал новый алгоритм расчета непрочитанных, надо будет проэкспериментировать.
Если идея была верной, позволит на несколько порядков поднять скорость, уменьшить базу непрочитанного и снизит
А в чем заключается идея?
Simba, О ты на гит какие то изменения выложил
Так как в таблице cms_forum_rdm есть уник key, там можно поубирать кое какие запросы, например
В index.php (+/-)
// Фиксация факта прочтения Топика
if ($systemUser->isValid() && $show_type == 'topic') {
$db->query("INSERT INTO `cms_forum_rdm` (topic_id, user_id, `time`)
VALUES ('$id', '" . $systemUser->id . "', '" . time() . "')
ON DUPLICATE KEY UPDATE `time` = VALUES(`time`)
");
//$req_r = $db->query("SELECT * FROM `cms_forum_rdm` WHERE `topic_id` = '$id' AND `user_id` = '" . $systemUser->id . "' LIMIT 1");
//
//if ($req_r->rowCount()) {
// $res_r = $req_r->fetch();
//
// if ($type1['last_post_date'] > $res_r['time']) {
// $db->exec("UPDATE `cms_forum_rdm` SET `time` = '" . time() . "' WHERE `topic_id` = '$id' AND `user_id` = '" . $systemUser->id . "' LIMIT 1");
// }
//} else {
// $db->exec("INSERT INTO `cms_forum_rdm` SET `topic_id` = '$id', `user_id` = '" . $systemUser->id . "', `time` = '" . time() . "'");
//}
}
В nt.php (+/-)
// Ставим метку о прочтении
$db->query("INSERT INTO `cms_forum_rdm` (topic_id, user_id, `time`)
VALUES ('$rid', '" . $systemUser->id . "', '" . time() . "')
ON DUPLICATE KEY UPDATE `time` = VALUES(`time`)
");
//$db->exec("INSERT INTO `cms_forum_rdm` SET
// `topic_id`='$rid',
// `user_id`='" . $systemUser->id . "',
// `time`='" . time() . "'
//");
И в new.php (+/-)
// Отмечаем все темы как прочитанные
$ids = $db->query("SELECT `forum_topic`.`id`, `forum_topic`.`last_post_date`
FROM `forum_topic` LEFT JOIN `cms_forum_rdm` ON `forum_topic`.`id` = `cms_forum_rdm`.`topic_id` AND `cms_forum_rdm`.`user_id` = '" . $systemUser->id . "'
WHERE `forum_topic`.`last_post_date` > `cms_forum_rdm`.`time` OR `cms_forum_rdm`.`topic_id` IS NULL")->fetchAll(PDO::FETCH_ASSOC);
foreach ($ids as $val) {
$values[] = '(' . $val['id'] . ', ' . $systemUser->id . ', ' . $val['last_post_date'] . ')';
}
$db->query('INSERT INTO cms_forum_rdm (topic_id, user_id, `time`) VALUES ' . implode(',', $values) . '
ON DUPLICATE KEY UPDATE `time` = VALUES(`time`)');
//$db->exec("INSERT INTO `cms_forum_rdm` (`topic_id`, `user_id`, `time`)
//SELECT `forum_topic`.`id`, '" . $systemUser->id . "', '" . time() . "'
//FROM `forum_topic` LEFT JOIN `cms_forum_rdm` ON `forum_topic`.`id` = `cms_forum_rdm`.`topic_id` AND `cms_forum_rdm`.`user_id` = '" . $systemUser->id . "'
//WHERE `cms_forum_rdm`.`topic_id` IS NULL");
//
//$ids = $db->query("SELECT `forum_topic`.`id`
//FROM `forum_topic` LEFT JOIN `cms_forum_rdm` ON `forum_topic`.`id` = `cms_forum_rdm`.`topic_id` AND `cms_forum_rdm`.`user_id` = '" . $systemUser->id . "'
//WHERE `forum_topic`.`last_post_date` > `cms_forum_rdm`.`time`")->fetchAll(PDO::FETCH_COLUMN);
//
//if (!empty($ids)) {
// $db->exec("UPDATE `cms_forum_rdm` SET
// `time` = '" . time() . "'
// WHERE `topic_id` IN (" . implode(',', $ids) . ") AND `user_id` = '" . $systemUser->id . "'
// ");
//}
Надо будет глянуть. Спасибо
Добавлено: 17.10.2019 / 10:29
kantry, а че ты PR не высылаешь?
Добавлено: 17.10.2019 / 10:48
А так, предложенная доработка абсолютно правильная.
Добавлено: 17.10.2019 / 10:54
Правда в nt.php доработка не нужна.
Там создается НОВАЯ тема и дублирующийся ключ теоретически невозможен.