Блокировка БД и оптимизация запросов

-zzz-
На сайте с 17.08.2007
Offline
69
821

Хостер заблочил БД и просил оптимизировать запросы:

У вас большое количество запросов вида:
UPDATE bb_sessions
SET session_user_id = -1, session_start = 1232545451, session_time = 1232545451, session_page = 0, session_logged_in = 0, se
ssion_admin = 0
WHERE session_id = ''
AND session_ip = '3e2142fe'

И таких

UPDATE bb_config SET
config_value = 'eb34e0fa11491e23bd320c2e2a4ec482'
WHERE config_name = 'rand_seed'

Данные запросы вызывают нестабильную работу нашей базы данных.
Оптимизируйте, пожалуйста, данные запросы.
На данный момент, база данных разблокирована.

Апдейты (Update) всегда больше нагружают сервак, но иногда без них не обойтись

Первый апдейт явно обновляет наличие пользователя (сессию) на сайте.

А второй запрос пока не знаю что делает.

Кто что посоветует сделать? ...сайт на phpbb2 plus

Лучшие тизерные ПП Recreativ (http://recreativ.ru/?r=4718) и Adsyst (http://adsyst.ru/index.php?ref=7287). ! Лучший хостинг Fornex (https://fornex.com/?server=557).
N
На сайте с 06.05.2007
Offline
419
#1

Для начала покажите

show create table bb_sessions;

select count(*) from bb_sessions;

Неплохо бы переодически помониторить show proccesslist, чтобы убедиться какие запросы нагружают сервер на самом деле. Не доверяю я этим словам.

Кнопка вызова админа ()
Слава Шевцов
На сайте с 23.07.2005
Offline
370
#2
-zzz-:
Апдейты (Update) всегда больше нагружают сервак, но иногда без них не обойтись

Первый апдейт явно обновляет наличие пользователя (сессию) на сайте.

Делайте UPDATE не при каждом дёргании страницы, а только когда сессия скоро "протухнет". Или раз в пять-десять минут. То есть UPDATE станут в основном SELECT-ами, а последние работают значительно быстрее. И, мне кажется, в этом UPDATE достаточно обновлять лишь session_time = 1232545451.

Неизменность точки зрения неизменно порождает иллюзию понимания.
N
На сайте с 06.05.2007
Offline
419
#3

Если таблица таблица в памяти enigine=memory, то это все ерунда. по крайней мере в vbulletin никто не спешит убирать подобный же запрос и он никогда не тормозит.

Слава Шевцов
На сайте с 23.07.2005
Offline
370
#4
netwind:
Если таблица таблица в памяти enigine=memory, то это все ерунда. по крайней мере в vbulletin никто не спешит убирать подобный же запрос и он никогда не тормозит.

В memory своя проблема - запись идёт значительно дольше, чем чтение. Хотя да, лучше эту таблицу держать в памяти.

N
На сайте с 06.05.2007
Offline
419
#5

Слава Шевцов, ну с чего бы ей тормозить?

обычные запросы используют такие таблицы неявно в качестве временного хранилища и ничего никто не замечает.

Слава Шевцов
На сайте с 23.07.2005
Offline
370
#6
netwind:
Слава Шевцов, ну с чего бы ей тормозить?

Фиг его знает. Тесты показывают, что скорость чтения записи из хешевых таблиц раз в пять выше, чем обновление записи в них же. Хотя в чём там дело - сам понять не могу.

[Удален]
#7
Слава Шевцов:
Фиг его знает. Тесты показывают, что скорость чтения записи из хешевых таблиц раз в пять выше, чем обновление записи в них же. Хотя в чём там дело - сам понять не могу.

думаю, дело то как раз в том что таблица адресуется хешами. Для поиска данных в ней используется один шаг, грубо говоря, а для вставки - от 1 до бесконечности в зависимости от размера таблицы и используемой хеш-функции. Но это должна быть жирная таблица, навскидку больше 50 тыщ записей. Временные таблицы в пуле при селектах довольно мелкие как правило. Редко кто-то передает в скрипт хотя бы тысячу записей. А апдейт еще более затратный в связи с необходимостью пересчета таблицы адресации. Если сессии давно не чистились, то там наверное ОЧЕНЬ большая таблица поэтому и тормоза на апдейте.

Поскольку в данном случае сам запрос оптимизировать уже некуда (кол-во записываемых полей имеет минимальное значение, в отличие от кол-ва полей сверки), остается минимизировать число его вызовов. Возможно, действительно стоит задумываться об обновлении сессии не на каждом переходе, а за N времени до её окончания. и ессно добавить один запрос select чтобы найти таковые, и в случае ненадобности, отсечь вызов апдейта.

Но вообще меня удивляет какие то претензии хостера к phpbb2. Сколько их запустил-поставил, ни разу не было жалоб.

N
На сайте с 06.05.2007
Offline
419
#8

Слава Шевцов, а тест у вас сильно параллельный был? дело в том, что там блокировка глобальная на всю таблицу. попробуйте на один из тысячи запросов записывать show profile и, возможно, увидите в чем дело. Есть еще патчи где slow_log записывает миллисекунды и , что очень важно в таких случаях, время, которое запрос ожидал блокировки.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий