Как можно оптимизировать вывод массива на экран.

mar_a

Новичок
Как можно оптимизировать вывод массива на экран.

Вопрос я бы счел тупее некуда но всеже:
есть массив значений из N данных
Его необходимо вывести на экран (часть или полностью неимеет значения , все определяется SQL запросом) .

Классика мирового жанра такая :

PHP:
      while($result=mysql_fetch_row($db_query)){
       
              ?><br /><a href="<?=$result[0]?>" title="<?=$result[1]?>"><?=$result[2]?></a><?

       }
Как не трудно догадаться - сия конструкция упрощенного меню :
НО
1) Строиться такое меню 0,40 сек (и из формирования всей страницы занимает более 40% общего времени).
2) Подобных меню будет больше 8 шт. (разумеется каждое из них будет выводить свои значения из уникальных SQL запросов).

Тривиальный и ожидаемый вопрос по этому поводу :

Как упростить сию конструкцию?
 

Beavis

Banned
mar_a
PHP:
      while($result=mysql_fetch_row($db_query)){ 
       }
а такая конструкция сколько по времени выполняется?
 

mar_a

Новичок
Beavis
Если имеется введу SQL запрос то 0,010 сек
Если имеется введу работа всего цикла (собственно о ней и идет разговор). ТО как я уже указал 0,40 сек

-~{}~ 29.10.07 12:45:

Mr_Max
Сорри с задержкой вот тот самый EXPLAIN

id select_type table type possible_keys key key_len ref rows Extra

1 SIMPLE y ALL id_midp NULL NULL NULL 8 Using temporary; Using filesort

1 SIMPLE x ref midp midp 11 test.y.id_midp 240 Using where

-~{}~ 29.10.07 12:50:

Да на локалке машина послабее в X раз поэтому ответ пришел за 0,08 сек , а полностью меню строится 0,56 сек
 

Beavis

Banned
mar_a
значит задержку вызывает именно функция mysql_fetch_row исполняющаяся в цикле?
 

mar_a

Новичок
Beavis
Самое смешное что цикл ты (Вы) видел(и)...

Нагрузка после выполнения SQL тоесть вовремя вывод тела цикла...
И может быть я ошибаюсь но сия команда :
while($result=mysql_fetch_row($db_query))
неужели по Вашему каждый раз терзает SQL запросами , сервер MySql ?
 

Beavis

Banned
mar_a
нет конечно... я поэтому и пытаюсь узнать у вас, это точно из за mysql_fetch_row тормоза?
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
mar_a
попробуйте получить меню при помощи 1-го запроса.

-~{}~ 29.10.07 12:15:

2. Вот Вы говорите, что сейчас выводите 1-но меню, но в
1 SIMPLE y ALL id_midp NULL NULL NULL 8 Using temporary; Using filesort
здесь почему-то выбираете все данные....

Что-то Вы недоговариваете.

-~{}~ 29.10.07 12:20:

3.
у Вас в меню
240 пунктов? :D
 

mar_a

Новичок
Beavis
Ладно попробуем пойти по другому пути:
1) В вопросе у меня были явные подозрения на цикл - в чем я упорно не соглашался долгое время... ( а не на SQL).
2) Цикл даже при выводе 100 строк так не тормозит. (но у меня ситуация показывает что может).
3) Делаю проще :
3.1) Заношу в массив переменные полученные выполнением SQL запроса
3.2) Предварительно узнаю сколько строк в массиве и используя
другой оператор например FOR выведу мой массив
3.3) Делаю вывод с помощью FOR ( .... ) { ..... }
3.4) Как видно в цикле нет запросов SQL но в этом случае у меня добавился еще один запрос кол-ва строк num_rows
3.5) Проблема осталась , т.к. время только увеличилось :
На 2 SQL запроса ушло 0,20 сек на построение меню 0,38 сек.


Результат незаставит себя долго ждать , ...
Либо я переустанавливаю сервер АПАЧ+МySQL либо он переустановит меня...

-~{}~ 29.10.07 13:30:

Mr_Max
Да смысл обманывать , да действительно у меня в
БД всего - то 240 значений именно в связанной таблице.
Но выводит то 8 пунктов из этих 240...
Т.е. я вижу с помощью проги MySQL-Front именно 8 значений которые и будут отображаться в меню

-~{}~ 29.10.07 13:33:

Mr_Max
Спасибо , конечно перестроим еще запрос и посмотрим в чем тормоза
 

Beavis

Banned
mar_a
mysql_num_rows не выполняет запрос по подсчету кол-ва строк... этой ф-ции в кач-ве аргумента передается уже результат запроса и она просто считает сколько строк в рез-те..
 

mar_a

Новичок
select y.name, x.midp , count(y.id)
from file x
LEFT JOIN midp y ON (y.id_midp=x.midp)
where x.dostup=y.dostup=1
group by y.id

Это и есть мой РЕАЛЬНЫЙ запрос.
Вот его EXPLAIN

id select_type table type possible_keys key key_len ref rows Extra

1 SIMPLE y ALL id_midp NULL NULL NULL 8 Using temporary; Using filesort

1 SIMPLE x ref midp midp 11 test.y.id_midp 240 Using where

-~{}~ 29.10.07 13:42:

Beavis
Это я к примеру ,... так ляпнул , буквы экономил ...

Короче понимаю что подталкиваете к SQL меня...
Я не против , а только ЗА. (Хочу понять где ошибка).
 

mar_a

Новичок
Mr_Max
Намек понял , согласен , но ранее думал что прогрех не в этом...
Задам из сложившейся ситуации вопросик связанный с синтаксисом , как правильно для данного случая (конкретного запроса) ?
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
mar_a
согласен , но ранее думал что прогрех не в этом...
ну так уберите посмотрите результат

как правильно для данного случая (конкретного запроса) ?
Что правильно? Что нужно? Или догадаться? :)

-~{}~ 29.10.07 12:59:

Попробую
AND `x`.`dostup`='1' AND `y`.`dostup`='1'
 

mar_a

Новичок
Mr_Max
Как ни странно результат такой-же :
select y.name, x.midp , count(y.id)
from file x
LEFT JOIN midp y ON (y.id_midp=x.midp)
where `x`.`dostup`='1' AND `y`.`dostup`='1'
group by y.id

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE y ALL id_midp NULL NULL NULL 8 Using where; Using temporary; Using filesort
1 SIMPLE x ref midp midp 11 test.y.id_midp 240 Using where


Я имел ввиду другое
быть может в самом коде SQL запроса то самое
where `x`.`dostup`='1' AND `y`.`dostup`='1'
и являются узким местом (тормозящей составляющей).
А вопрос по синтаксису у меня такой :
Может данное where `x`.`dostup`='1' AND `y`.`dostup`='1'
можно оптимизировать на LEFT JOIN ...
Только запрос как ?
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Бред.
Запрс неможет исполнятся так долго...

show create table?
 

mar_a

Новичок
Mr_Max
1-я :
CREATE TABLE `midp` (
`id` int(10) unsigned zerofill NOT NULL auto_increment,
`id_midp` varchar(20) default NULL,
`name` tinytext,
`dostup` char(3) default '1',
PRIMARY KEY (`id`),
KEY `id_midp` (`id_midp`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=9 ;



2-я :
CREATE TABLE `file` (
`id` int(10) NOT NULL auto_increment,
`name` text,
`category` varchar(20) default NULL,
`razr` varchar(20) default 'stop',
`midp` varchar(10) default '1',
`note` text,
`patch` varchar(100) default 'localhost',
`dostup` char(3) default '1',
`vid` varchar(10) default 'no_size',
`price` varchar(10) default '10',
`raiting` int(20) unsigned default '0',
`date_pub` varchar(20) default '0',
`image1` varchar(50) default NULL,
`image2` varchar(50) default NULL,
`image3` varchar(50) default NULL,
`image4` varchar(50) default NULL,
`file_name1` varchar(50) default NULL,
`file_name2` varchar(100) default NULL,
`file_name3` varchar(100) default NULL,
`file_name4` varchar(100) default NULL,
PRIMARY KEY (`id`),
KEY `midp` (`midp`),
KEY `vid` (`vid`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=240 ;

-~{}~ 29.10.07 14:30:

Автор оригинала: Mr_Max
Бред.
Запрс неможет исполнятся так долго...

show create table?
Я тоже хотел-бы что-б было быстрее ... но цифры зараза упрямые
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Кошмар.
Поприводите поля к нормальным форматам.
числовые - числовым
Даты - к дате

1. 2.
`dostup` - enum ('0', '1')?
`id_midp` - в чиловой формат?

А зачем групировка по полю с автоинкриментом?

-~{}~ 29.10.07 13:41:

CREATE TABLE `midp` (
`id` int(10) unsigned zerofill NOT NULL auto_increment,
У вас будет 4 294 967 295 строк в таблице?

-~{}~ 29.10.07 13:42:

http://www.mysql.ru/docs/man/Column_types.html
 

mar_a

Новичок
Mr_Max
1) Если это приведет к повышению скорости то причешу ,
вопрос сейчас не в этом...
2) Группировка по полю с автоинкрементом разве недопустима?
3) Будет ли у меня столько записей ?
Наверное врятли ( полностью согласен) , но согласитесь пока это к делу отношения никакого не имеет...
А если и имеет то ничтожно малое...

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

Есть ли какие- нибудь глобальные замечания , может поибирать все эти индексы по далее и не использовать Join а просто поставить тупое соответствие ... AND y.id_midp=x.midp AND ...
хотя это врядли прибавит скорости...
 

Ermitazh

Новичок
mar_a
а меню будет формироваться каждый раз как будет произведён refresh страницы?
 
Сверху