За последние 24 часа нас посетили 15807 программистов и 1666 роботов. Сейчас ищут 823 программиста ...

Смена типа бызы

Тема в разделе "MySQL", создана пользователем allowance, 29 сен 2010.

  1. allowance

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

    С нами с:
    19 янв 2010
    Сообщения:
    196
    Симпатии:
    0
    Когда просматриваю всe табицы в phpmyadmin, то в самой нижней строчке показывает - InnoDB
    А так во всех таблицах тип - MyISAM.

    Я так полагаю что InnoDB тип БД? Как его поменять на MyISAM?
     
  2. Апельсин

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

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    это то что по умолчанию стоит.

    то что сам выбрал.
     
  3. allowance

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

    С нами с:
    19 янв 2010
    Сообщения:
    196
    Симпатии:
    0
    Апельсин

    А при таком запросе какой тип таблицы лучше использовать?

    PHP:
    1. $ip=getenv("HTTP_X_FORWARDED_FOR");
    2. if (empty($ip) || $ip=='unknown') { $ip=getenv("REMOTE_ADDR"); }
    3. # уд. старые сессии
    4. mysql_query ("DELETE FROM online_eng, WHERE UNIX_TIMESTAMP() - UNIX_TIMESTAMP(time) > 60") or die ("Can't delete old sess");
    5. mysql_query ("DELETE FROM online WHERE UNIX_TIMESTAMP() - UNIX_TIMESTAMP(time) > 60") or die ("Can't delete old sess");
    6.  
    7. # проверка на присутстаие или занесение нового пользователя
    8. $select = mysql_query ("SELECT ip FROM online_eng WHERE ip='$ip'") or die ("Can't select duble");
    9. $tmp = mysql_fetch_row ($select);
    10. if ($ip == $tmp[0]) {
    11. mysql_query ("UPDATE online_eng SET time=NOW() WHERE ip='$ip'") or die ("Can't update");
    12. } else {
    13. mysql_query ("INSERT INTO online_eng (ip,time) VALUES ('$ip',NOW())") or die ("Can't insert");
    14. }
     
  4. Апельсин

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

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    это мало как относится к типу таблиц. юзай myisam, если записей до пару десятков тысяч предвидеться и не парь себе голову.
     
  5. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Апельсин
    А так же если не предвидится транзакций и Foreign Keys =))
     
  6. Апельсин

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

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    Volt(220)
    Я в этом не сильно разбираюсь, потому сильно умничать не стал. Чуток только :)
     
  7. stas_t

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

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    добрый день

    есть мнение, что не стоит, наверное, при каждом запросе к странице сайта выполнять DML операции с базой. всё равно какой тип у таблицы (если это, конечно, не memory). если вы хотите удалять сессии пользователей, которые в течение 60 секунд не отправили нового запроса, то запускайте удаление раз в минуту хотя бы.

    и уберите это странное использование unix_timestamp(). замените его на
    Код (Text):
    1. '... where time < '.($_SERVER['REQUEST_TIME'] - 60)
    если одновременно активных сессий будет мало, то time можно не индексировать.

    да, всю вторую половину кода (после комментария) замените на
    Код (Text):
    1. mysql_query ("insert into online_eng (ip,time) values ('$ip','{$_SERVER['REQUEST_TIME']}') on duplicate key update time = values(time)");
    и это... поддерживать две таблицы online довольно странно (ровно вдвое дороже).

    p.s. а вообще, чтобы поддерживать сессию пользователя в статусе online, лучше использовать кэш (или memory-таблицы), из которого раз в ту же самую минуту сбрасывать обновлённые данные в базу. но тогда тут всё придётся переписать... и немного подумать перед тем, как сделать правильно.