PDA

Просмотр полной версии : [Вопрос] "Аптимизация"



Seviel
10.04.2018, 13:50
Есть у меня код, не красивый, собственно вот он, можно ли сделать из двух(ну по факту их три, но выполнится только два) один?

stock AddHouseSafeItem(houseid, model, amount)
{
new string[102];
mysql_format(connect, string, sizeof string, "SELECT `amount` FROM `house_safe` WHERE `house`='%d' AND `model`='%d'", houseid, model);
new Cache:cache = mysql_query(connect, string);
if(cache_get_row_count(connect) > 0) {
amount += cache_get_field_content_int(0, "amount");
mysql_format(connect, string, sizeof string, "UPDATE `house_safe` SET `amount`='%d' WHERE `house`='%d' AND `model`='%d'", amount, houseid, model);
} else {
mysql_format(connect, string, sizeof string, "INSERT INTO `house_safe`(`house`,`model`,`amount`) VALUES ('%d','%d','%d')", houseid, model, amount);
}
cache_delete(cache, connect);
return mysql_tquery(connect, string);
}

DeimoS
10.04.2018, 14:31
Можно попробовать сделать запрос по принципу "INSERT ... ON DUPLICATE KEY UPDATE (https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html)", но не уверен, что в твоём случае это сработает + у такой реализации есть неприятный побочный эффект в виде увеличения значения AUTO_INCREMET даже тогда, когда сработает вторая часть запроса, содержащая UPDATE. При частых вызовах можно получить выход за пределы Integer. Ну и в целом такой запрос будет довольно медленный, ибо сначала MySQL просмотрит содержимое всей таблицы на предмет нахождения подходящего ID, а только потом будет выполнять действие.

Лучше оставить общий вид таким, каким он есть сейчас. Разве что можно убрать работу с amount, перенеся её на плечи MySQL


stock AddHouseSafeItem(houseid, model, amount)
{
new string[102];
format(string, sizeof string, "SELECT 1 FROM house_safe WHERE house=%d AND model=%d", houseid, model);
Cache:string[0] = mysql_query(connect, string);
if(cache_get_row_count(connect))
{
cache_delete(Cache:string[0], connect);
format(string, sizeof string, "UPDATE house_safe SET amount=amount+%d WHERE house=%d AND model=%d", amount, houseid, model);
}
else
{
format(string, sizeof string, "INSERT INTO house_safe(house,model,amount) VALUES (%d,%d,%d)", houseid, model, amount);
}
return mysql_tquery(connect, string);
}