В SQL я еще слабо разбираюсь. Вот возник вопрос, возможно, выполнить два запроса в одном или нет? Пример: регистрация пользователя создается новая запись в таблице users и в таблице online. Чтобы не делать два запроса к таблице может можно их обледенить в одну?
Если на сайте допустим 10000 зарегистрированных пользователей. Мне кажется, гораздо быстрее будет пробежаться по таблице online, где будет 100 записей, чем перебрать все 10000 записей из таблицы users.
dark-demon Угу, а как переводить пользователей обратно в статус "оффлайн", если они с сайта свалили? Регулярно пробегаться по ВСЕЙ таблице пользователей и менять статус у устаревших, или вешать индекс и при каждом хите вносить изменения? Не зря во всех системах делается отдельная таблица для людей, находящихся онлайн, и не зря этой таблице обычно дается имя "sessions"... oligarx все правильно делает, и в двух INSERT запросах я не вижу ничего плохого. Это же регистрация, она не каждую секунду происходит.
1) при использовании кнопки "выход" - удаляем сессию 2) при каждой реавторизации удаляем просроченные сессии.
dark-demon Время от времени (например, каждый сотый хит) сканируем таблицу сессий и удаляем просроченные записи. Механизм сессий в PHP именно так и работает. Разница в том, что если для сессий есть отдельная таблица, в которой максимум 100 записей, то это не страшно, а вот если такой таблицы нет и надо сканировать всю базу участников на 10000 записей, тут-то и начинаются проблемы. Введение индекса на поле "дата последней активности" не помогает, сам понимаешь почему.
Однажды писал класс замену стандартной команды session_start(); Для очистки БД использовал такой метод: PHP: <?php /** * Очистка мусора в БД * */ private function sess_gc() { srand(time()); if ((rand() % 100) < 5){ $expire = time() - 1440; $this->db->query("DELETE FROM `session` WHERE `last_activ` < ".$expire); } } Он вызывается в конструкторе класса и не нагружает БД .