Перейти к контенту
  • 0

Sessions или оптимизация


AirVit

Вопрос

Итак.

Что делать, когда побилась таблица сессий - знаю, не маленький.

 

Форум вырос, по 400 человек в онлайне. Радоваться бы надо, но.. с периодичностью в час - два, вылетает на.. фиг mysql со словами, то кол-во подключений к серверу больше max connections, то, что самое противное Ibf_sessons убился.

я уже своим модерам скрипт отдал, чтобы запускали repair ..

Но, вечно же так продолжаться не может?

 

Включил дебаг, полез разбираться.

 

Есть куча запросиков к таблице, к этой. Юзер, каждый раз к ней обращается, когда совершает ЛЮБОЕ действие. MySQL нифига не Oracle, он 400 обращений одновременно к одной таблице, да еще на апдейт пережить не может.

 

В связи с чем есть несколько вопросов:

1. Может нафиг убить гостей? Т.е. пусть они по форуму ходят, сообщения читают, но таблицу нашу драгоценную, сессий, не трогают, а? Кто - то пытался подобное сделать? Нет? Чего тут плохого? Я то сам, скорее всего сделаю, но хотелось бы гуру послушать, авось подскажут, что дурак и сюда нельзя ходить?

 

2. При входе на главную у нас сразу, практически

SELECT id, member_id, member_name, login_type, running_time, member_group FROM ibf_sessions WHERE running_time > 1168524585

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

 

3. Есть такая штука полезная - кто и какой форум просматривает, типа location.. я его в админке отключил, т.е. показываться перестало - минус один запрос, но все равно, при переходах, эта тварь в таблицу то лезет и пишет - где я нахожусь.. Что тут поделать?

 

И вообще, по оптимизации, может кто еще чего подскажет? - топик про debug читал, все настроил, и сервак выделенный, и база только моя. И все равно, раз в сутки падения, раз в 2 дня перегруз mysql.

Жуть как обидно.

 

Спасибо, ногами не бейте, а?

Ссылка на комментарий
Поделиться на других сайтах

Рекомендуемые сообщения

  • 0
Пытался создать - не помогает, все равно explain пишет, что fullscan таблицы идет.

смотря сколько строк в таблице.

Если 50 - охотно верю.

Если 400 то должен индекс использовать.

 

И вообще, по оптимизации, может кто еще чего подскажет?

Попробуй сменить тип таблицы на INNODB.

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Строк? 1233

 

EXPLAIN SELECT id, member_id, member_name, login_type, running_time, member_group

FROM ibf_sessions

WHERE running_time >1168527010

 

Вот результат

 

 

 

id select_type table type possible_keys key key_len ref rows Extra

1 SIMPLE ibf_sessions ALL running_time NULL NULL NULL 1233 Using where

 

 

я не совсем-совсем тупой , честно!

вот индексы

 

Имя ключа Тип Количество элементов Действие Поле

PRIMARY PRIMARY 1257 Правка Уничтожить id

location1 INDEX 314 Правка Уничтожить location_1_type

location_1_id

location2 INDEX 38 Правка Уничтожить location_2_type

location_2_id

location3 INDEX 0 Правка Уничтожить location_3_type

location_3_id

running_time INDEX 1257 Правка Уничтожить running_time

 

 

 

Прошу прощения, последний совет пропустил.

Не подскажете, а чем поможет InnoDB?

Или мне в RTFM?

Ссылка на комментарий
Поделиться на других сайтах

  • 0
Не подскажете, а чем поможет InnoDB?

Перестанет падать табличка.

 

Чего-то я ничего не понял в ваших индексах.

Прикрепите результат SHOW CREATE TABLE ibf_session в части индексов.

Ссылка на комментарий
Поделиться на других сайтах

  • 0

InnoDB вчера поставил.

За ночь ни разу вроде не падала.

Вот индексы:

 

  PRIMARY KEY  (`id`),
 KEY `location1` (`location_1_type`,`location_1_id`),
 KEY `location2` (`location_2_type`,`location_2_id`),
 KEY `location3` (`location_3_type`,`location_3_id`),
 KEY `running_time` (`running_time`)

 

 

ну а тут полный create

 

CREATE TABLE `ibf_sessions` (
 `id` varchar(32) NOT NULL default '0',
 `member_name` varchar(64) default NULL,
 `member_id` mediumint(8) NOT NULL default '0',
 `ip_address` varchar(16) default NULL,
 `browser` varchar(200) NOT NULL default '',
 `running_time` int(10) default NULL,
 `login_type` tinyint(1) default NULL,
 `location` varchar(40) default NULL,
 `member_group` smallint(3) default NULL,
 `in_error` tinyint(1) NOT NULL default '0',
 `location_1_type` varchar(10) NOT NULL default '',
 `location_1_id` int(10) NOT NULL default '0',
 `location_2_type` varchar(10) NOT NULL default '',
 `location_2_id` int(10) NOT NULL default '0',
 `location_3_type` varchar(10) NOT NULL default '',
 `location_3_id` int(10) NOT NULL default '0',
 PRIMARY KEY  (`id`),
 KEY `location1` (`location_1_type`,`location_1_id`),
 KEY `location2` (`location_2_type`,`location_2_id`),
 KEY `location3` (`location_3_type`,`location_3_id`),
 KEY `running_time` (`running_time`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251;

Ссылка на комментарий
Поделиться на других сайтах

  • 0
вылетает на.. фиг mysql со словами, то кол-во подключений к серверу больше max connections

Попробуй постоянное соединение с БД, как описано тут:

Оптимизация IPB и повышение скорости работы форума

Ссылка на комментарий
Поделиться на других сайтах

  • 0

не надо постоянного соединения при таком количестве людей!

 

InnoDB вчера поставил. За ночь ни разу вроде не падала.

Объясню почему InnoDB.

На уровне таблицы MyISAM блокировка происходит на уровне целой таблицы. Например, когда одна нить пишет в таблицу MyISAM, второй читающий - ждёт. СУБД сама разруливает такие блокировки, но иногда не получается, и из-за двух разнонаправленных действий, табличка крашится.

В InnoDB блокировка происходит на уровне только одной записи.

Т.е. одновременная запись и чтение запрещены только одной и той же записи, чего не бывает. Поэтому и краш таблицы маловероятен.

 

 

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

Сделайте EXPLAIN запроса, результаты сюда покажите.

Ссылка на комментарий
Поделиться на других сайтах

  • 0

DeTerminator

Постоянное подключение, вроде как требует поддержки хостером. Я пока не смотрел, но буду.

Спасибо за совет.

 

Song

 

я вроде уже писал ответ? - нет?

 

Просто не знаю как сюда табличку вставить..

 

попробую еще раз

EXPLAIN SELECT id, member_id, member_name, login_type, running_time, member_group
FROM ibf_sessions
WHERE running_time >1168524585

id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra

1 | SIMPLE | ibf_sessions | ALL | running_time | NULL | NULL | NULL | 647 | Using where

 

спасибо за разъясения про InnoDB, уже почитал про поддержку транзакций в InnoDB.

 

буду посмотреть как она себя дальше проявит!

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Если индекс не используется, значит СУБД его невыгодно использовать.

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

Если рассматривать ситуацию конкретно с ibf_sessions то это означает, что сессий с условием "WHERE running_time >1168524585" очень много.

Поэтому, чтобы наладить ситуацию уменьшите время жизни сессии. У вас наверно там час стоит? :D

 

Сравните по вашей таблице:

SELECT COUNT(*) FROM ibf_sessions WHERE running_time > x

SELECT COUNT(*) FROM ibf_sessions

И дайте оба числа в следующий раз когда индекс не будет использоваться.

Ссылка на комментарий
Поделиться на других сайтах

  • 0

про оба числа не очень понял.

Время жизни сессии, действительно 3600 стояло.

Изменил на 900 секунд. Это нормально?

Ссылка на комментарий
Поделиться на других сайтах

  • 0

15 минут вполне.

А теперь через некоторое время, когда ненужные сессии удалятся, проверь запрос. Будет работать индекс или нет.

 

про оба числа не очень понял.

Я хотел, чтобы ты наглядно убедился, почему не работает индекс.

Для этого нужно было выполнить два этих запроса.

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Ответить на вопрос...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.