Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> оптимизация двух циклов, все работает, но только тормозит 
:(
    Опции темы
Sukhof
Дата 11.4.2005, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 114
Регистрация: 18.4.2004
Где: Тюмень

Репутация: 0
Всего: 2



Привет всем! срочно нужна помощь, просто горю, есть два цикла (один в другом), первый цикл формирует html таблицу второй подставляет значения в ячейки этой таблицы. Все работает, все нормально. Но если размер таблицы большой (содержит 300 ячеек) то все начинает тормозить. ПОМОГИТЕ оптимизировать следующий код

Код

sqlr();//подключаемся к первой базе в которой храняться параметры таблицы
                            $result = mysql_query("select * from str_title where step = '$step' order by str_title");
                            while ($row = mysql_fetch_array($result))
                            {

                             if($row['new'] == 1)://полученное значение равно 1 то начинаем формировать новую html строку
                             echo '<tr>'."\n".'<td>';
                             echo $row['title'].'</td>'."\n";endif;

sql('');//подключаемся ко второй базе в которой храняться значения подставляемые в ячейки
                            $result2 = mysql_query("select * from $tbl where id = '$id' and year = '$year'");
                            $num_row = mysql_num_rows($result2);

                            if($num_row)://если данные есть то подставляем их в таблицу
                            while ($row2 = mysql_fetch_array($result2))
                            {
                                 echo '<td >';
                                 echo '<input type=text size=4 name='.$row['p'].' value="';
                                 echo $row2[$row['p']];
                                 echo '"></td>'."\n";
                            }
                             else://если нет то выводим пустую ячейку
                                 echo '<td>';
                                 echo '<input type=text size=4 name='.$row['p'].' value="';
                                 echo $row2[$row['p']];
                                 echo '" ></td>'."\n";
                             endif;
                            }
                             echo '</tr>';

--------------------
Не бойся делать то, что не умеешь. Помни Ковчег построил любитель, а Титаник профессионалы.
PM MAIL   Вверх
Opik
Дата 11.4.2005, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: 24
Всего: 55



для начала вместо всех
Код

echo "";

сделай
Код

$out .= "";

и потом только 1 раз
Код

echo $out;

т.е
Цитата
if($row['new'] == 1)://полученное значение равно 1 то начинаем формировать новую html строку
                            echo '<tr>'."\n".'<td>';
                            echo $row['title'].'</td>'."\n";endif;

можно записать как:
Код

if($row['new'] == 1)//полученное значение равно 1 то начинаем формировать новую html строку
{
                    $out .= '<tr>'."\n".'<td>'.$row['title'].'</td>'."\n";
}

вместо if(): endif лучше юзать $if(){}
первый вариант вроде устарел, пока советов больше нет.
PM MAIL Skype   Вверх
Sukhof
Дата 11.4.2005, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 114
Регистрация: 18.4.2004
Где: Тюмень

Репутация: 0
Всего: 2



Спасибо совет принял, все исправил, но скорость незначительно улучшилась, проблема здесь заключена в том что для формирования каждой ячейки приходится делать обращение к БД. Но как сделать иначе я не знаю.
--------------------
Не бойся делать то, что не умеешь. Помни Ковчег построил любитель, а Титаник профессионалы.
PM MAIL   Вверх
Opik
Дата 11.4.2005, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: 24
Всего: 55



Sukhof
дело в том, что я не вижу ключей, по которым можно связать таблицы.
PM MAIL Skype   Вверх
Sukhof
Дата 11.4.2005, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 114
Регистрация: 18.4.2004
Где: Тюмень

Репутация: 0
Всего: 2



таблицы к сожалению связать никак они имеют такой вид:

Код

mysql> select * from register.str_title where step = 0;
+-----------+------+----------------+------+------+
| str_title | step | title          | p    | new  |
+-----------+------+----------------+------+------+
|         1 |    0 | яхЁтр  ёЄЁюър  | p1   |    1 |
|         2 |    0 | тЄюЁр  ёЄЁюър  | p2   |    1 |
|         3 |    0 | ЄЁхЄ№  ёЄЁюъ  | p3   |    1 |
|         4 |    0 | я Єр  ёЄЁюър   | p4   |    1 |
|         5 |    0 | °хёЄр  ёЄЁюър  | p5   |    1 |
+-----------+------+----------------+------+------+
5 rows in set (0.02 sec)

в поле "р" храняться названия полей из которых необходимо взять значение
следовательно дальше подключаемся к другой таблице и из нужных полей (основываясь на первом запросе) взять значения и подставить их в html таблицу
Код

mysql> select * from datereg.cadr where year = 2004;
+---------+------+------+------+------+------+------+------+
| cadr_id | id   | p1   | p2   | p3   | p4   | p5   | year |
+---------+------+------+------+------+------+------+------+
|      36 | 3032 |   16 |  277 |   36 | 4666 |  588 | 2004 |
+---------+------+------+------+------+------+------+------+
1 row in set (0.00 sec)

mysql>

--------------------
Не бойся делать то, что не умеешь. Помни Ковчег построил любитель, а Титаник профессионалы.
PM MAIL   Вверх
OPG
Дата 11.4.2005, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 25.2.2005

Репутация: 1
Всего: 1



Вчера читал материалы по оптимизации, так вот. Во - первых, используй постоянные соединения для обращения к базе. Второе, и самое важное, чтобы сократить время поиска в базе данных всем поля во второй таблице приведи к одному типу поля с одним (одинаковым!!!) значением длины. Хрен с ним с тем, что потеряешь на каждом поле по несколько байт, скорость возрастет. И сделай поля не переменной длины, а постоянной! Особо сути не помню, но чтобы найти узкое место при анализе обращений к таблицам есть специальный оператор в MySQL, который надо писать перед запросом и он показывает сколько обращений идет к каждой колонке и т.п. Так вот, там на одном примере очень простом показано, что если привести поля к одной длине (не переменной, а постоянной), то количество запросов сократилось в 74 раза!!! Если надо я тебе могу отсканировать и прислать завтра этот материальчик, если сообщишь в течении получаса, что о н тебе нужен. Книга дома.
PM MAIL   Вверх
Opik
Дата 11.4.2005, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: 24
Всего: 55



Погодь, а так:
Код

                            $result = mysql_query("select t1.*, t1.p as t1p, t2.*
                                                                  from str_title as t1
                                                                  left join $tbl as t2 on (t1.p = t2.t1p)
                                                                  where t1.step = '$step' 
                                                                             and t2.year = '$year'
                                                                  order by t1.str_title");
                            while ($row = mysql_fetch_array($result))
                            {
                                 var_dump($row);
                            }
                             echo '</tr>';

только не знаю как быть с переключением базы. да и проверь, работает ли это вообще?
Добавлено @ 14:06
OPG
выложи куда нибудь? кинь в в приват, например, выложу в ФАК,
PM MAIL Skype   Вверх
Sukhof
Дата 11.4.2005, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 114
Регистрация: 18.4.2004
Где: Тюмень

Репутация: 0
Всего: 2



Да было бы великолепно, буду ждать.
--------------------
Не бойся делать то, что не умеешь. Помни Ковчег построил любитель, а Титаник профессионалы.
PM MAIL   Вверх
OPG
Дата 11.4.2005, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 25.2.2005

Репутация: 1
Всего: 1



Ладно. ОК. Только вышлю сканы, а то с FinуReader ом нет времени возиться.
PM MAIL   Вверх
OPG
Дата 12.4.2005, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 25.2.2005

Репутация: 1
Всего: 1



Цитата(Sukhof @ 11.4.2005, 14:06)
Да было бы великолепно, буду ждать.

Все отправил тебе на мейл. Лови.
PM MAIL   Вверх
Opik
Дата 13.4.2005, 07:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: 24
Всего: 55



отправь на opik (at) opik.ru?
PM MAIL Skype   Вверх
OPG
Дата 13.4.2005, 07:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 25.2.2005

Репутация: 1
Всего: 1



Отправлю, сегодня, но позже. У нас тут канал узкий, DSL собираются только ставить, поэтому пошлю частями. Всего 10 листов. Может запросишь переслать Sukhof?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0917 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.