Доступ к готовым решениям

Переход в группу "Пользователь"

300.00
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Мануал Оптимизация запросов mysql

_Mihail_

Начинающий
Пользователь
Регистрация
25 Июл 2012
Сообщения
41
Лучшие ответы
0
Репутация
0
Всем привет!

Плохо, что не сделал этого раньше!

Размеры запросов постоянно растут и использовать SavePlayer со всеми параметрами - не лучшая идея. (не только Player)

Чтобы не вваливать такие огромные запросы - нужно сделать синхронизацию каждой переменной с mysql при ее изменении.


PHP:
enum pInfo
{
 p_id,//id в таблице mysql
 p_money,
}
new PlayerInfo[MAX_PLAYER][pInfo];
PHP:
stock EditPlayer_int(playerid,params,pInfo_name[],id=0,bool:know=true)
//где playerid - id игрока, если онлайн; params - сюда пихаем действие с переменной; pInfo_name[] - название переменной в таблице mysql; id - если игрок оффлайн, но мы знаем его p_id; know - задать значение = true, выполнить с числом сложение (делал для money) = false
{
new time = GetTickCount();//засекаем время
	if(id==0)//если игрок онлайн
		id=PlayerInfo[playerid][p_id];
	new query_string[500] = "UPDATE `players` SET";//"players" на свое название
	if(!know)//если значение переменной нужно прибавить know==false
			format(query_string, sizeof(query_string), "%s `%s` = `%s`+'%d'", query_string,pInfo_name,pInfo_name, params);
	else
			format(query_string, sizeof(query_string), "%s `%s` = '%d'", query_string,pInfo_name, params);
	format(query_string, sizeof(query_string), "%s WHERE `id` = '%d'", query_string, id);
	mysql_tquery(mysql_connect_ID, query_string, "", "");//"mysql_connect_ID" - на свое название
	printf("[save_player]: <%i>.\ttime size: <%i мс>.\t params: %s",id,GetTickCount()-time,pInfo_name);
	return 1;
}
то же можно проделать с char и float

пример использования:
PHP:
CMD:givemoney(playerid,params[])//если игрок онлайн
{
new giveplayerid,moneydd;
if(sscanf(params, "dd", giveplayerid,moneydd))return SCM(playerid,COLOR_HELP,"/givemoney [id][money]");
EditPlayer_int(giveplayerid,PlayerInfo[giveplayerid][p_money]+=moneydd,"money");//"money" меняй на свое название
return 1;
}

CMD:offgivemoney(playerid,params[])//если игрок офлайн
{
new giveplayerid,moneydd;
if(sscanf(params, "dd", giveplayerid,moneydd))return SCM(playerid,COLOR_HELP,"/offgivemoney [id][money]");
EditPlayer_int(0,moneydd,"money",giveplayerid,false);//в итоге прибавит значение moneydd к значению "money" в таблице
//giveplayerid - id из mysql таблицы
}
ВАЖНО: представлен только вариант с целыми числами (не float, не char)

Можно не использовать SavePlayer при disconnect, т.к все переменные записываются в таблицу при их изменении.

Если есть предложения по улучшению сей функции - буду только рад выслушать:ab:
 
Последнее редактирование:
Сверху Снизу