Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   Оптимизация взаимодействия с БД (http://www.flasher.ru/forum/showthread.php?t=201211)

Astraport 14.06.2013 22:17

2500 в цикле приложения? Тогда понятно. А для PHP 2500 иттераций не так уж и много. Хотя смотря какая база, какой хостинг и т. п.

AlexCooper 14.06.2013 22:47

Цитата:

Сообщение от Babylon (Сообщение 1138031)
Уверен AlexCooper, что вы ошибайтесь:)

Возможно. Взглянуть бы на структуру, уверен там косяк в архитектуре.

GBee 14.06.2013 22:57

Цитата:

2500 в цикле приложения? Тогда понятно.
2500 это вообще ни о чем.

Fartoviy_Spec 14.06.2013 23:11

Вложений: 1
Вот так выглядит кусок БД:
http://www.flasher.ru/forum/attachme...1&d=1371232000
Я формирую xml, через php:
PHP код:

<?php
...
$sql=@mysql_query('SELECT * FROM `'.$mysql_table.'`') or die(mysql_error());
echo 
"<?xml version='1.0' encoding='UTF-8' ?>";
echo 
"<response>";
for (
$i=0;$i<mysql_num_rows($sql);$i++)
{
$res=mysql_fetch_array($sql);
echo 
"<block>";
echo 
"<turnir>".$res['turnir']."</turnir>";
echo 
"<nomer_kruga>".$res['nomer_kruga']."</nomer_kruga>";
echo 
"<pobeditel>".$res['pobeditel']."</pobeditel>";
echo 
"<proigravshiy>".$res['proigravshiy']."</proigravshiy>";
echo 
"<shet>".$res['shet']."</shet>";
echo 
"<total>".$res['total']."</total>";
echo 
"<ochki_pobeditel>".$res['ochki_pobeditel']."</ochki_pobeditel>";
echo 
"<ochki_proigravshiy>".$res['ochki_proigravshiy']."</ochki_proigravshiy>";
echo 
"</block>";
}
echo 
"</response>";
?>

И получившийся xml полностью загружаю в приложение. Приложение я делаю для себя, то есть денвер использую просто для того, чтобы была возможность работать с БД.

Дальше происходит множество различных операций, одна из которых получение из всей БД списка игроков. Для этого и необходим цикл из 2500 итераций, так как я заношу первое имя в список, а последующие уже заносятся, если такого имени еще не было.

В качестве примера вот эта функция:
Код AS3:

function ARR_IGROKOV():void
        {
                var win_zanos = false;
                var lose_zanos = false;
                arr_igrokov.push(String(xmllist[0].pobeditel));
                for (var i=0; i<xmllist.length(); i++)
                {
                        mass_matchey.push(String(xmllist[i].pobeditel),String(xmllist[i].proigravshiy));
                        win_zanos = false;
                        lose_zanos = false;
                        for (var t=0; t<arr_igrokov.length; t++)
                        {
                                if (String(xmllist[i].pobeditel)==arr_igrokov[t])
                                {
                                        win_zanos = true;
                                }
                                if (String(xmllist[i].proigravshiy)==arr_igrokov[t])
                                {
                                        lose_zanos = true;
                                }
 
                                if ((win_zanos==true)&&(lose_zanos==true))
                                {
                                        break;
                                }
                        }
                        if (win_zanos==false)
                        {
                                arr_igrokov.push(String(xmllist[i].pobeditel));
                        }
                        if (lose_zanos==false)
                        {
                                arr_igrokov.push(String(xmllist[i].proigravshiy));
                        }
                }
                arr_igrokov.sort();
        }

Эта операция работает, но на других более громоздких вычислениях происходит ошибка "превышено время выполнения".
Я понимаю, что как то я не правильно делаю, что гружу всю БД, но я не понимаю как быть по другому.
Решение разбивать пачками конечно есть, то ест цикл брать не 2500, а 5 циклов по 500 строк например, как говорил maincode, но это все таки как то не оптимально, да и наверно не везде получится применить.

Babylon 14.06.2013 23:22

Что надо отображать за один раз то и надо дергать с сервера.

Добавлено через 3 минуты
То есть можно определить интервал строк, выходя за который, идет запрос к серверу за порцией данных.

maxkar 14.06.2013 23:36

Как же все запущено... scan по массиву вместо использования прямого отображения. И в результате вы имеете 2500*2500/2 операций вместо 2500. Используйте обычный map (оно же Object) с нужными ключами. Или два object'а (я особо не разбирался), оно на пару порядков быстрее работать будет. Может быть, оно и из базы правильно выбирается одним запросом, нужно понять что именно в результате вы хотите.

Korchy 15.06.2013 09:38

2 Fartoviy_Spec

А зачем вам тогда база данных, с таким подходом? Храните все данные в текстовом файлике. Результат будет абсолютно тот же самый. Но это сарказм, сорри. :)

Сделайте несколько php-скриптов. Каждый из которых будет возвращать вам из вашей базы данных то, что нужно в определенный момент. Выборку же регулируйте через sql. Это мощнейший механизм, а вы его напрочь игнорируете.
Например, для получения уникального списка игроков по двум колонкам, приведенным в примере:
Код:

"select distinct * from (select pobeditel from ".$mysql_table." union select proigravshi from ".$mysql_table.") as p_table"
такой запрос на сервере для б.д. в 2500 записей выполняется за сотые доли секунды и вы получаете список, который уже можете преобразовать в xml и отослать флеш-клиенту.
Точно так же и с другими запросами. Не нужно нагружать клиента тем, что база сама сделает гораздо быстрее.
А при том подходе, что у вас, подумайте - когда база дорастет до пары тройки гигабайт (а это вполне нормальный размер для базы), сколько времени будет тратиться на ее полную пересылку и обработку клиентом?

caseyryan 15.06.2013 11:44

Korchy, а зачем конкатенация в запросах?
Лично мне составление запросов в php тем и нравится, что переменные можно прямо в строки добавлять, без конкатенаций и лишних заморочек.
Код:

"select distinct * from (select pobeditel from `$mysql_table` union select proigravshi from `$mysql_table`) as p_table"

КорДум 15.06.2013 11:46

Цитата:

а зачем конкатенация в запросах?
Не все версии PHP поддерживают такой синтаксис. Рекомендуется использовать конкатенацию, чтобы было наверняка. Меня за такое побили по рукам наши кодеры )

caseyryan 15.06.2013 11:57

Понятно) значит я уже на тех, что не поддерживают не кодил


Часовой пояс GMT +4, время: 09:47.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.