За последние 24 часа нас посетил 30541 программист и 1800 роботов. Сейчас ищут 944 программиста ...

Два запроса в одном

Тема в разделе "MySQL", создана пользователем oligarx, 15 май 2007.

  1. oligarx

    oligarx Активный пользователь

    С нами с:
    23 янв 2007
    Сообщения:
    68
    Симпатии:
    0
    Адрес:
    Украина Львов
    В SQL я еще слабо разбираюсь. Вот возник вопрос, возможно, выполнить два запроса в одном или нет?
    Пример: регистрация пользователя создается новая запись в таблице users и в таблице online. Чтобы не делать два запроса к таблице может можно их обледенить в одну?
     
  2. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    а зачем ты разбил это не две таблицы?
     
  3. oligarx

    oligarx Активный пользователь

    С нами с:
    23 янв 2007
    Сообщения:
    68
    Симпатии:
    0
    Адрес:
    Украина Львов
    Если на сайте допустим 10000 зарегистрированных пользователей. Мне кажется, гораздо быстрее будет пробежаться по таблице online, где будет 100 записей, чем перебрать все 10000 записей из таблицы users.
     
  4. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    зачем перебирать? повесь индекс на это поле.
     
  5. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    dark-demon
    Угу, а как переводить пользователей обратно в статус "оффлайн", если они с сайта свалили? ;)
    Регулярно пробегаться по ВСЕЙ таблице пользователей и менять статус у устаревших, или вешать индекс и при каждом хите вносить изменения?
    Не зря во всех системах делается отдельная таблица для людей, находящихся онлайн, и не зря этой таблице обычно дается имя "sessions"... oligarx все правильно делает, и в двух INSERT запросах я не вижу ничего плохого. Это же регистрация, она не каждую секунду происходит.
     
  6. oligarx

    oligarx Активный пользователь

    С нами с:
    23 янв 2007
    Сообщения:
    68
    Симпатии:
    0
    Адрес:
    Украина Львов
    Dagdamor
    спасибо за одобрение :wink:

    просто хочется выжить максимум скорости
     
  7. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    А ещё online таблицу делают типа MEMORY :) Так быстрее
     
  8. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    а теперь мы подходим к вопросу: "а как мы определяем, что пользователи онлайн?"
     
  9. oligarx

    oligarx Активный пользователь

    С нами с:
    23 янв 2007
    Сообщения:
    68
    Симпатии:
    0
    Адрес:
    Украина Львов
    что-то тут совсем от вопроса отклонились
     
  10. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    1) при использовании кнопки "выход" - удаляем сессию

    2) при каждой реавторизации удаляем просроченные сессии.
     
  11. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    а если пользователь просто закрыл браузер?
     
  12. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    dark-demon
    Время от времени (например, каждый сотый хит) сканируем таблицу сессий и удаляем просроченные записи. Механизм сессий в PHP именно так и работает. Разница в том, что если для сессий есть отдельная таблица, в которой максимум 100 записей, то это не страшно, а вот если такой таблицы нет и надо сканировать всю базу участников на 10000 записей, тут-то и начинаются проблемы. Введение индекса на поле "дата последней активности" не помогает, сам понимаешь почему.
     
  13. oligarx

    oligarx Активный пользователь

    С нами с:
    23 янв 2007
    Сообщения:
    68
    Симпатии:
    0
    Адрес:
    Украина Львов
    Однажды писал класс замену стандартной команды session_start();
    Для очистки БД использовал такой метод:
    PHP:
    1. <?php
    2. /**
    3. * Очистка мусора в БД
    4. *
    5. */
    6. private function sess_gc()
    7. {
    8.   srand(time());
    9.   if ((rand() % 100) < 5){
    10.     $expire = time() - 1440;
    11.     $this->db->query("DELETE FROM `session` WHERE `last_activ` < ".$expire);
    12.   }
    13. }
    Он вызывается в конструкторе класса и не нагружает БД .
     
  14. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Дак а не лучше тогда написать собственный обработчик сессий и хранить данные в БД?
     
  15. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Sergey89
    Ги, проснулсо...
     
  16. oligarx

    oligarx Активный пользователь

    С нами с:
    23 янв 2007
    Сообщения:
    68
    Симпатии:
    0
    Адрес:
    Украина Львов
    Я так и делал :)
     
  17. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    а причём тут сессии?

    нет, не понимаю.