[MySQL] Проблемы при сохранении базы данных.
#1

Здравствуйте. Уже много тем здесь перечитал, но не нашел той, в которой помогло бы мне решить мою проблему.

Суть проблемы такова:

Сервер начинает "подвисать" на 10-20 сек. после сохранения всех данных игрока на сервере. Такая проблема проявляется только при онлайне, достигающем ближе к отметке 200. Сначала, я запаниковал и перевёл мод на более новую версию MySQL R39_2 от BlueG, т.к задержка с плагином MySQL r6, 10-20 секунд. И когда перевёл, мне сервер выдавал задержку не более 10 миллисекунд. Это меня обрадовало и я думал, что проблема решена, но при онлайне 200+, я увидел после сохранение "жесткие" лаги на сервере. Сервер будто "умирал" на 20-30 секунд, а потом "оживал".

Всего 6 запросов в сохранении аккаунтов игроков. Лимиты string для строк подсчитал. Обращение идёт на индекс в базе игрока.
Сохранение делаю через обычный:
format(..."UPDATE... WHERE `id` = '%i'); // (если ли смысл пробовать с mysql_format(..) не знаю)
mysql_pquery(..., ..., "", "");

Возможно ошибка где-то тут.

P.S Стоит сохранение делать при каждом действии? И также добавлю, что данное "подвисание" не каждый раз, раз через раз.


Подскажите как, либо, что предпринять для данной проблемы. Уверен, что люди сталкивались с таким и где-то тут, где я не нашел, лежит ответ.
Reply
#2

reAL_, ну насколько я помню mysql_format спасает от sql инъекций, и попробуйте использовать вместо mysql_pquery mysql_tquery,т.к. pquery это однопоточный запрос, может просто создается очередь запросов и поэтому происходит подвисание? , у меня все сохранения сделаны через mysqL_tquery, лагов пока не замечал, но особой нагрузки не было, был только тест с онлайном 20 человек - полет нормальный

Если я в чем-то неправ - поправьте меня
Reply
#3

Всё правильно, очередь запросов = лаги
Reply
#4

я такие вещи по таймеру сохраняю, ~200 мсек между запросами, можно больше/меньше. 1 запрос около 1-10 мсек идет
Reply
#5

vampir9763, при 100-170 человек и mysql_pquery ведёт себя отлично, при сохранении.

mysql_escape_string + format(..) = mysql_format(...) + "%e" (об этом я знаю, уже протестировал)

На wiki сайте об MySQL: https://sampwiki.blast.hk/wiki/MySQL/R33#mysql_pquery

mysql_pquery:

Quote:

The difference between this native and mysql_tquery() is, that this type of query uses multi-threading, thus it's faster depending on how many connections are used. The number of connections can be specified in mysql_connect() through the pool_size parameter. Each connection resembles a thread.

Что в переводе звучит:

Quote:

Разница между этим native (mysql_pquery()) и mysql_tquerty() в том, что этот тип запроса использует многопоточность, таким образом, это быстрее в зависимости от того, сколько соединений он использует. Каждое соединение указывается в mysql_connect()... бла-бла бла.

Я это понимаю так, что он быстрее mysql_tquery и обрабатывается не одним потоком.

Если я ошибаюсь, поправите. Проблема с "зависанием" до сих пор не решена.
Reply
#6

reAL_, на сколько мне объясняли pquery - это однопоточный запрос, а tquery - многопоточный, но надо будет перечитать документацию по плагину, я могу и ошибаться
Reply
#7

Quote:
Originally Posted by vampir9763
Посмотреть сообщение
reAL_, на сколько мне объясняли pquery - это однопоточный запрос, а tquery - многопоточный, но надо будет перечитать документацию по плагину, я могу и ошибаться
Они оба многопоточны, просто используют разные потоки.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)