1. Соблюдайте Правила форума и проявляйте уважение к другим участникам беседы.

Оптимизация insert select запросов бота в БД.

Тема в разделе 'Кодинг/Собственные решения', создана пользователем Mefix, 6 дек 2011.

Статус темы:
Закрыта.
  1. ____ROB____ Старожила

    Сообщения:
    1.008
    Спасибы:
    22
    Сборка бота GHost:
    Ghost One 1.5
    нужно что-то одно сначало cделать, так как второе будет подстраиватся под первое ну или наоборот (я про бота и OS).
  2. Mefix Наш человек

    Сообщения:
    114
    Спасибы:
    3
    Хм... У меня тут вопрос затесался. Пока с модернизацией бота решил погодить. Хотя она всё равно нужна.

    Возник вопрос как переделать top.php у Openstats, чтобы он брал значения из таблицы Scores, а то при разных комбинациях, значений в конфиге, тупо считает или пересчитывает. Или там надо переписывать запрос всё таки? Есть решение?
  3. rost Гуру

    Сообщения:
    1.258
    Спасибы:
    150
    Сборка бота GHost:
    LtG
    Дата начала использования бота:
    01.11.2010
    Skype:
    Мой статус
    Запрос можно подогнать да.
    Дело в include их там много очень. Собирает страницу по частям, плюс в запросах много ненужного и некоректного (в некоторых)
  4. fake Старожила

    Сообщения:
    1.624
    Спасибы:
    19
    Дата начала использования бота:
    11.11.11
    зачем по лефт ризону??
    если в статсдоте уже все готово, тем более что диск в 90% случаев = лив.
  5. rost Гуру

    Сообщения:
    1.258
    Спасибы:
    150
    Сборка бота GHost:
    LtG
    Дата начала использования бота:
    01.11.2010
    Skype:
    Мой статус
    Ну незнаю. У меня просто берет и если лефтризон лив, то минусует очки.
    А 90% случаев диск = лив, ну хз, я б поспорил бы, хотя наверное только потому, что сам нестардал херней этой, ну и по сути нивижу тут смысла... мб ты и прав.
  6. fake Старожила

    Сообщения:
    1.624
    Спасибы:
    19
    Дата начала использования бота:
    11.11.11
    диск = выход с вара, иногда даже выход в батлнет, только диск с лагскрином, можно считать лагом( и то когда комп офаешь, появится лаг скрин) остальное редко возникает при ошибках с инетом.
  7. Mefix Наш человек

    Сообщения:
    114
    Спасибы:
    3
    Гм... Сейчас наткнулся на траблу... таблица Score взбесилась, значения пляшут. Ни удаление и создание новой, ни очистка таблицы не помогает. Кто знает в чём может быть трабл? elo_dota не юзаю. Использую схему расчёта очков в самом боте.

    PS: понял почему. Когда заканчивается игра, все значения из БД удаляются. Мде... Криво в БРТ это сделали.
  8. rost Гуру

    Сообщения:
    1.258
    Спасибы:
    150
    Сборка бота GHost:
    LtG
    Дата начала использования бота:
    01.11.2010
    Skype:
    Мой статус
    как успехи? :bIbIbIblya:
  9. freed Наш человек

    Сообщения:
    7
    Спасибы:
    2
    Ничего там не удаляется
  10. Synth (LM) Пантограф!

    Сообщения:
    2.762
    Спасибы:
    172
    Сборка бота GHost:
    My own version of GhostOne
    Дата начала использования бота:
    15.06.2008
    Skype:
    Мой статус
    Наверно он имел ввиду :lol:
  11. rost Гуру

    Сообщения:
    1.258
    Спасибы:
    150
    Сборка бота GHost:
    LtG
    Дата начала использования бота:
    01.11.2010
    Skype:
    Мой статус
  12. Mefix Наш человек

    Сообщения:
    114
    Спасибы:
    3
    Работа работа... Никак не могу понять почему Leave не выводится... Хотя строчку изменил.:
    Код:
     //Query = "SELECT count(*) FROM gameplayers as gp LEFT JOIN games ON games.id=gp.gameid WHERE gp.left < games.duration - 180 AND gp.name='"+ EscUser+"';";
    	Query = "SELECT total_leaves FROM totalstats WHERE name='"+ EscUser+"';";
    
    	if( mysql_real_query( (MYSQL *)conn, Query.c_str( ), Query.size( ) ) != 0 )
    		*error = mysql_error( (MYSQL *)conn );
    	else
    	{
    		MYSQL_RES *Result = mysql_store_result( (MYSQL *)conn );
    
    		if( Result )
    		{
    			vector<string> Row = MySQLFetchRow( Result );
    			if( Row.size( ) == 1 && Score)
    				Score->SetLeaveCount(UTIL_ToUInt32( Row[0] ));
    			/* else
    				*error = "error checking score [" + category + " : " + name + " : " + server + "] - row doesn't have 1 column"; */
    			mysql_free_result( Result );
    		}
    		else
    			*error = mysql_error( (MYSQL *)conn );
    	}
    
    	return Score;
  13. Mefix Наш человек

    Сообщения:
    114
    Спасибы:
    3
    Гм... Работает код. Видимо просто не выводится т.к. другие запросы выше и ниже не были переписаны. Там я не менял ещё выборку по gp. Видимо т.к. значения пустые меня и посылает )))

    Ладно посмотрим.

    PS: Dev забраковал мою идею выводить Leave_count и прочее в новую таблицу. (((
  14. Mefix Наш человек

    Сообщения:
    114
    Спасибы:
    3
    Пока не устранил проблему если игрока в таблице нету, что делать. ). Спросил совета, сказали решение подскажут через обработку ошибки, именно средствами мускуля. И собственно часть проблемы уже решена.

    Код:
    uint32_t MySQLDotAPlayerAdd( void *conn, string *error, uint32_t botid, uint32_t gameid, uint32_t colour, uint32_t kills, uint32_t deaths, uint32_t creepkills, uint32_t creepdenies, uint32_t assists, uint32_t gold, uint32_t neutralkills, string item1, string item2, string item3, string item4, string item5, string item6, string hero, uint32_t newcolour, uint32_t towerkills, uint32_t raxkills, uint32_t courierkills, string name )
    {
    	uint32_t RowID = 0;
    	string EscName = MySQLEscapeString( conn, name );
    	string EscItem1 = MySQLEscapeString( conn, item1 );
    	string EscItem2 = MySQLEscapeString( conn, item2 );
    	string EscItem3 = MySQLEscapeString( conn, item3 );
    	string EscItem4 = MySQLEscapeString( conn, item4 );
    	string EscItem5 = MySQLEscapeString( conn, item5 );
    	string EscItem6 = MySQLEscapeString( conn, item6 );
    	string EscHero = MySQLEscapeString( conn, hero );
    	string Query = "INSERT INTO dotaplayers ( botid, gameid, colour, kills, deaths, creepkills, creepdenies, assists, gold, neutralkills, item1, item2, item3, item4, item5, item6, hero, newcolour, towerkills, raxkills, courierkills ) VALUES ( " + UTIL_ToString( botid ) + ", " + UTIL_ToString( gameid ) + ", " + UTIL_ToString( colour ) + ", " + UTIL_ToString( kills ) + ", " + UTIL_ToString( deaths ) + ", " + UTIL_ToString( creepkills ) + ", " + UTIL_ToString( creepdenies ) + ", " + UTIL_ToString( assists ) + ", " + UTIL_ToString( gold ) + ", " + UTIL_ToString( neutralkills ) + ", '" + EscItem1 + "', '" + EscItem2 + "', '" + EscItem3 + "', '" + EscItem4 + "', '" + EscItem5 + "', '" + EscItem6 + "', '" + EscHero + "', " + UTIL_ToString( newcolour ) + ", " + UTIL_ToString( towerkills ) + ", " + UTIL_ToString( raxkills ) + ", " + UTIL_ToString( courierkills ) + " )";
    			Query+ = "UPDATE totalstats SET total_kills=total_kills+" + UTIL_ToString( kills ) + ", total_deaths=total_deatsh+" + UTIL_ToString( deaths ) + ", total+creepkills+total_creepkills+" + UTIL_ToString( creepkills ) + ", total_cpeerdenies=total_creepdenies+" + UTIL_ToString( creepdenies ) + ", total_assists=total_assist+" + UTIL_ToString( assists ) + ", total_neutralkills=total_neutralkills+" + UTIL_ToString( neutralkills ) + ", total_towerkills=total_towerkills+" + UTIL_ToString( towerkills ) + ", total_raxkills=total_raxkills+" + UTIL_ToString( raxkills ) + ", total_courierkills=total_courierkills+" + UTIL_ToString( courierkills ) + " where name='" + EscName + "'";
    	if( mysql_real_query( (MYSQL *)conn, Query.c_str( ), Query.size( ) ) != 0 )
    		*error = mysql_error( (MYSQL *)conn );
    	else
    		RowID = (uint32_t)mysql_insert_id( (MYSQL *)conn );
    
    	return RowID;
    }
  15. Mefix Наш человек

    Сообщения:
    114
    Спасибы:
    3
    Хм... Ну как сделать это я понял.
    Только когда более проблемно подошёл к вопросу и обсудил лично с человеком. Решили что лучше триггерами обойтись. так что запрос статы я переписал, осталось триггеры написать которые инсерты будут ловить. Перекодировать и считать как надо )

    Ну и отыметь весь моск с топом.

    Как вижу никому не надо заниматься.
  16. fake Старожила

    Сообщения:
    1.624
    Спасибы:
    19
    Дата начала использования бота:
    11.11.11
    тихо, сам с собою я веду беседу...

    Ты пишешь такие стены текстов, причем каждое сообщение дополняет другое, и ты думаешь кто-то будет это все читать???
    Самая простая оптимизация - это максимальное сокращение "ненужных" запросов селекта, путем добавления "нужных" полей и добавление запросов инсерта. :patsak:
  17. rost Гуру

    Сообщения:
    1.258
    Спасибы:
    150
    Сборка бота GHost:
    LtG
    Дата начала использования бота:
    01.11.2010
    Skype:
    Мой статус
    истину глаголит :prayy:
  18. Mefix Наш человек

    Сообщения:
    114
    Спасибы:
    3
    Кхм.... Я выкладываю мысли чтобы посоветоваться.
  19. fake Старожила

    Сообщения:
    1.624
    Спасибы:
    19
    Дата начала использования бота:
    11.11.11
    По-моему ты не уловил разницу между словами блог и форум.
Статус темы:
Закрыта.