Оптимизация запросов и своя функция doquery ()

Фанат

oncle terrible
Команда форума
А, так это разные таблицы.
нет, в один свести нельзя, но дублированные - можно.
то есть, сократить на три.
 

Sergiy

Новичок
Автор оригинала: zerkms
Sergiy
в конфиге мускула
В phpmyadmin не нашёл ничего, кроме "Включить статистику " и посмотреть "Статус БД" т.е. "Текущее состояние MySQL"
Как испрвить конфиг, не знаю.

А вот собственно, один из главнейших скриптов игры.
PHP:
<?php

/**
 * FlyingFleetHandler.php
 */

function FlyingFleetHandler (&$planet) {
	global $resource;


	$QryFleet   = "SELECT * FROM {{table}} ";
	$QryFleet  .= "WHERE (";
	$QryFleet  .= "( ";
	$QryFleet  .= "`fleet_start_galaxy` = ". $planet['galaxy']      ." AND ";
	$QryFleet  .= "`fleet_start_system` = ". $planet['system']      ." AND ";
	$QryFleet  .= "`fleet_start_planet` = ". $planet['planet']      ." AND ";
	$QryFleet  .= "`fleet_start_type` = ".   $planet['planet_type'] ." ";
	$QryFleet  .= ") OR ( ";
	$QryFleet  .= "`fleet_end_galaxy` = ".   $planet['galaxy']      ." AND ";
	$QryFleet  .= "`fleet_end_system` = ".   $planet['system']      ." AND ";
	$QryFleet  .= "`fleet_end_planet` = ".   $planet['planet']      ." ) AND ";
	$QryFleet  .= "`fleet_end_type`= ".      $planet['planet_type'] ." ) AND ";
	$QryFleet  .= "( `fleet_start_time` < '". time() ."' OR `fleet_end_time` < '". time() ."' );";
	$fleetquery = doquery( $QryFleet, 'fleets' );

	while ($CurrentFleet = mysql_fetch_array($fleetquery)) {
		switch ($CurrentFleet["fleet_mission"]) {
			case 1:
				// Attaquer
				MissionCaseAttack ( $CurrentFleet );
				break;

			case 2:
				// Attaque group&#9500;йe
				doquery ("DELETE FROM {{table}} WHERE `fleet_id` = '". $CurrentFleet['fleet_id'] ."';", 'fleets');
				break;

			case 3:
				// Transporter
				MissionCaseTransport ( $CurrentFleet );
				break;

			case 4:
				// Stationner
				MissionCaseStay ( $CurrentFleet );
				break;

			case 5:
				// Stationner chez un Alli&#9500;й
				//doquery ("DELETE FROM {{table}} WHERE `fleet_id` = '". $CurrentFleet['fleet_id'] ."';", 'fleets');
				MissionCaseStayAlly ( $CurrentFleet );
				break;

			case 6:
				// Flotte d'espionnage
				MissionCaseSpy ( $CurrentFleet );
				break;

			case 7:
				// Coloniser
				MissionCaseColonisation ( $CurrentFleet );
				break;

			case 8:
				// Recyclage
				MissionCaseRecycling ( $CurrentFleet );
				break;

			case 9:
				// Detruire ??? dans le code ogame c'est 9 !!
				MissionCaseDestruction ( $CurrentFleet );
				break;

			case 10:
				// Missiles !!
				break;

			case 15:
				// Expeditions
				MissionCaseExpedition ( $CurrentFleet );
				break;

			default: {
				doquery("DELETE FROM {{table}} WHERE `fleet_id` = '". $CurrentFleet['fleet_id'] ."';", 'fleets');
			}
		}
	}

}

?>
мы тут подумали, что лучше свести у одному запросу, например так:
PHP:
<?php

/**
 * FlyingFleetHandler.php
 *
 */

function FlyingFleetHandler ( $CurrentFleet ) {
     global $resource;

     doquery("LOCK TABLE {{table}}lunas WRITE, {{table}}rw WRITE, {{table}}errors WRITE, {{table}}messages WRITE, {{table}}fleets WRITE, {{table}}planets WRITE, {{table}}galaxy WRITE ,{{table}}users WRITE", "");

          switch ($CurrentFleet["fleet_mission"]) {
               case 1:
                    // Attaquer
                    MissionCaseAttack ( $CurrentFleet );
                    break;

               case 2:
                    // Attaque group&#9500;йe
                    MissionCaseAttack ( $CurrentFleet );
                    break;

               case 3: // Transporter
                    MissionCaseTransport ( $CurrentFleet );
                    break;

               case 4:
                    // Stationner
                    MissionCaseStay ( $CurrentFleet );
                    break;

               case 5:
                    // Stationner chez un Alli&#9500;й
                    //doquery ("DELETE FROM {{table}} WHERE `fleet_id` = '". $CurrentFleet['fleet_id'] ."';", 'fleets');
                   MissionCaseStayAlly ( $CurrentFleet );
                    break;

               case 6:
                    // Flotte d'espionnage
                    MissionCaseSpy ( $CurrentFleet );
                    break;

               case 7:
                    // Coloniser
                    MissionCaseColonisation ( $CurrentFleet );
                    break;

               case 8:
                    //Recyclage
                    MissionCaseRecycling ( $CurrentFleet );
                    break;

               case 9:
                    // Detruire ??? dans le code ogame c'est 9 !!
                    MissionCaseDestruction ( $CurrentFleet );
		    break;

               case 10:
                    // Missiles !!
                    break;

               case 15:
                    // Expeditions
                    MissionCaseExpedition ( $CurrentFleet );
      	break;
               default: {
                    doquery("DELETE FROM {{table}} WHERE `fleet_id` = '". $CurrentFleet['fleet_id'] ."';", 'fleets');
               }
          }

     doquery("UNLOCK TABLES", "");
}
?>
Это будет оптимизацией ???
 

MSW

Новичок
Это:
PHP:
doquery ( "DELETE FROM {{table}} WHERE `message_sender` = '" . $UserID . "';", 'messages' );
doquery ( "DELETE FROM {{table}} WHERE `message_owner` = '" . $UserID . "';", 'messages' );
будет выглядеть так? /* сорри, на работе нет доступа к коду игры, не могу проверить сразу... */
PHP:
doquery ( "DELETE FROM {{table}} WHERE `message_sender` = '" . $UserID . "' AND `message_owner` = '" . $UserID . "';", 'messages' );
 

MSW

Новичок
нет, сами себе не пишут, это удаляет все сообщения что посылись этому пользователь у него из входящих, и у тех кому он писал, из входящих сообщений
 

Фанат

oncle terrible
Команда форума
Sergiy, а в чем оптимизация? а какие у вас еще идеи есть? а надо вообще оптимизировать-то?

-~{}~ 02.06.08 12:48:

MSW ну как же не пишут, если этот запрос удаляет строки, в которых и отправитель и получатель - один и тот же.
 

Фанат

oncle terrible
Команда форума
Я вообще не понимаю, как вы с такими познаниями игру смогли написать.
Составляя запрос, надо понимать, что условия запроса применяются к СТРОКЕ, а не к таблице.

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

-~{}~ 02.06.08 12:57:

С запросами, изменяющими БД, следует поступать ОЧЕНЬ осторожно.
Наверняка у вас используются индексы. индексы перестраиваются каждый раз, когда меняется индексированное поле.
выполняя 10 запросов, вы запускаете перестройку десяти индексов
у вашего хостера железная база - она прочно стоит и рубит только коннекты.

при этом нафига вообще что-то делетить рантайм - загадка.
 

Sergiy

Новичок
Ещё раз. Как включить журналирование запросов мускула?
Допустим, в Интернете может хостер и не дал мне права менять конфиг.
Но в Денвере то я могу это сделать?
В файле My.cnf -
# Раскомментируйте для журналирования UPDATE-запросов
# log-bin
Это?
И где этот файл будет и под каким именем?
 

zerkms

TDD infected
Команда форума

Sergiy

Новичок
Автор оригинала: zerkms
my.ini, включить лош запросов

какое имя укажешь в конфиге, в такой файл и будет писаться
Блин, в Денвере нет my.ini :(

Какие поля таблиц желательно индексировать?
Как посмотреть, какие поля уже индексированы?
 

Фанат

oncle terrible
Команда форума
закрываю тему.
они относятся к людям, которые не понимают, что им говорят.
 

Ralph

Дикий столяр
Почитал вот утречком перед работой и создалось такое впечатление,что им следует слова "пишем" заменить на "переписываем"...Комментарии на французском,не знать,что делает твоя функция,что делает твой запрос,какие поля проиндексированы ??? :-/
 

Sergiy

Новичок
А зачем мне комментарии переписывать?
Всё я в скрипте игры понимаю, что какая функция делает.
Просто хотел насчёт этой проконсультироваться.
И поля уже нашёл как через phpmyadmin индексировать.
А вы могли бы подсказать, вместо оплёвывания свысока.
 

Sergiy

Новичок
Автор оригинала: baev
— где Вы этот скрипт взяли?
В Интернете. Opensource.

-~{}~ 03.06.08 15:36:

Автор оригинала: *****
Sergiy
Кто-то из вас - дурак. Либо ты, либо хостер.
Либо у нас неполная информация.

Судя по тексту функции, которую ты привел здесь, никто при каждом запросе не подключается к базе.
И соединения создаются не постоянные.
для "гуру" объясняем механизьм "на пальцах".

Условия просты: на одной странице делается 10 запросов к БД.
Вариант А (как это сделано с этой функцией doquery)

1-1. Подключаемся к СУБД.
1-2. Делаем селект БД.
1-3. Делаем запрос.
1-4. Отключаемся от СУБД.

2-1. Подключаемся к СУБД.
2-2. Делаем селект БД.
2-3. Делаем запрос.
2-4. Отключаемся от СУБД.
.....

10-1. Подключаемся к СУБД.
10-2. Делаем селект БД.
10-3. Делаем запрос.
10-4. Отключаемся от СУБД.

Итого 40 операций.

Вариант Б (как это сделано у всех остальных).

1-1. Подключаемся к СУБД.
1-2. Делаем селект БД.
1-3. Делаем запрос.

2-3. Делаем запрос.

3-3. Делаем запрос.

4-3. Делаем запрос
.....
10-3. Делаем запрос
10-4. Отключаемся от СУБД.

Итого: 13 операций.

Если для вас не очевидно, что 13 операций это меньше чем 40, то мне не понятно о чем вообще идёт речь
http://www.ayola.net/forum/index.php/topic,3773.0.html
 

zerkms

TDD infected
Команда форума
Sergiy
чудик, покажи 4 ступень операции, в которой "отключаемся от субд" в приведённой тобой функции, пожалуйста
 

Sergiy

Новичок
Автор оригинала: zerkms
Sergiy
чудик, покажи 4 ступень операции, в которой "отключаемся от субд" в приведённой тобой функции, пожалуйста
Оно на выходе из каждой функции происходит автоматически
 

Фанат

oncle terrible
Команда форума
прекрасно. Будем знать, что хостинг Ayola не рекомендуется в силу крайней тупости администрации.

Sergiy, рекомендую от них уйти в более адекватное место.

-~{}~ 03.06.08 16:11:

а проблема твоя, как уже не раз говорилось, совсем не в этой функции.

-~{}~ 03.06.08 16:17:

Sergiy
Я понимаю, что ты находишься между двух несдержанных на аргументы личностей.
но у тебя есть одно преимущество.
ты можешь легко проверить, кто прав.
никто не мешает тебе вставить в функцию проверку.
к примеру, перед функцией mysql_connect написать
echo "tzps - придурок";
и посмотреть, сколько раз оно будет выведено при 10 вызовах функции.
 
Сверху