Привет! Имеется каталог товаров. В каждом разделе от 10 до 200 товаров. Так вот когда щелкаем по разделам где мало товаров 5 - 10 то вроде нормал, быстро открываются а вот если больших по 100 или 200 товаров тогда напряжно долго. Может быть как-то упростить запросы? Или может быть применить бесконечную прокрутку - это когда при скролинге подгружается по 10 моделей например. Посоветуйте пожалуйста что сделать... Вот ссылка на работу такого каталога: http://la-vittoria.ru/view_cat.php?parent_group_id=4e2f4b99 ... 15f2b8ef81 Исходный код файла который выводит данный каталог: Код (Text): <? include("block/bd.php"); if (isset($_GET['group_id'])) {$group_id=$_GET['group_id'];} $group_id = $_GET['parent_group_id']; ?> <!DOCTYPE HTML> <html> <head> <meta charset="utf-8" /> <title></title> <meta name="description" content=" " /> <meta name="keywords" content=" " /> <meta name='yandex-verification' content='44bea9583d5cd256' /> <meta name="viewport" content="width=1100" /> <link rel="stylesheet" href="css/reset.css" /> <link rel="stylesheet" href="css/style.css" /> <!--[if IE 6]> <link rel="stylesheet" type="text/css" href="css/styleIE6.css"> <![endif]--> <!--[if IE 7]> <link rel="stylesheet" type="text/css" href="css/styleIE7.css"> <![endif]--> <!--[if IE 8]> <link rel="stylesheet" type="text/css" href="css/styleIE8.css"> <![endif]--> <script src="scripts/jquery.js" type="text/javascript"></script> <script src="scripts/jquery.lazyload.js" type="text/javascript"></script> <script type="text/javascript">$(function() { $("img").lazyload({ effect:"fadeIn" }); }); </script> </head> <body> <div id="background_left"></div> <div id="wrapper"> <? include("block/header.php"); include("block/left_menu.php"); echo("<div id='wrapper_product_view_cat'>"); ?> <? echo (" <div class='breadcrumps'> <p> <a href='http://la-vittoria/index.php'>Главная</a> › <a href='catalog.php'>Каталог</a> › ".$myrow_meta["name"]." </p> </div> "); ?> <? echo (" ".$myrow_tovar["description"]." "); function getMinPriceById($id) { $t=mysql_query(" SELECT MIN(shop_prices.value) as value,shop_itemimages.filename FROM shop_prices INNER JOIN shop_items ON shop_items.item_id=shop_prices.item_id LEFT JOIN shop_itemimages ON shop_itemimages.item_id=shop_prices.item_id WHERE shop_items.owner_id='$id'"); if(mysql_num_rows($t)) { $result=mysql_fetch_array($t); return $result; } else return false; } $result_tovar = mysql_query (" SELECT shop_items.id, shop_items.name, shop_items.article, shop_items.item_id, shop_itemimages.filename, shop_prices.value FROM shop_items LEFT JOIN shop_prices ON shop_prices.item_id=shop_items.item_id LEFT JOIN shop_itemimages ON shop_itemimages.item_id=shop_items.item_id WHERE shop_items.parent_group_id='$group_id' AND owner_id ='0' GROUP BY shop_items.item_id ORDER BY `shop_items`.`article` LIKE 'Л%' DESC, `shop_items`.`article` LIKE 'Л%' ASC, `shop_items`.`article` "); $myrow_tovar = mysql_fetch_assoc($result_tovar); do { if(trim($myrow_tovar["value"])=='') { $arr=getMinPriceById($myrow_tovar["item_id"]); $myrow_tovar["value"]=$arr['value']; $myrow_tovar["filename"]=$arr['filename']; } $myrow_tovar["value"]=(int)$myrow_tovar["value"]; echo (" <a href='view_model.php?item_id=".$myrow_tovar["item_id"]." '> <div class='model'> <img src='http://la-vittoria.ru/1c/catalog/".$myrow_tovar["filename"]."' width='163' height='250' /> ".$myrow_tovar["name"]." <p class='price'>".$myrow_tovar["value"]." руб</p> </div> </a> "); } while($myrow_tovar = mysql_fetch_assoc ($result_tovar)); echo("</div>"); include("block/footer_menu.php"); include("block/footer_contakts.php"); include("block/footer_copyright.php"); ?> </div> </body> </html>
Тормоз на 200 записях это ненормально. Включаем профилирование и потом разбираем запросы: http://dev.mysql.com/doc/refman/5.6/en/show-profile.html http://dev.mysql.com/doc/refman/5.6/en/explain.html http://www.php.su/mysql/manual/?page=EXPLAIN далее смотрим где происходит затык. Индексы в таблицах проставлены хоть? )
Когда вывожу ТОЛЬКО артикулы или имена моделей то все нормально. Когда через php функцию вытаскиваю из других таблиц цену и путь к фотке то все начинаются тормоза. Даже цены достаточно.
разметка синтаксиса очень помогает! используй [ code=php ] [ /code ]— без пробелов, конечно Код (PHP): <? include("block/bd.php"); if (isset($_GET['group_id'])) {$group_id=$_GET['group_id'];} $group_id = $_GET['parent_group_id']; ?> <!DOCTYPE HTML> <html> <head> <meta charset="utf-8" /> <title></title> <meta name="description" content=" " /> <meta name="keywords" content=" " /> <meta name='yandex-verification' content='44bea9583d5cd256' /> <meta name="viewport" content="width=1100" /> <link rel="stylesheet" href="css/reset.css" /> <link rel="stylesheet" href="css/style.css" /> <!--[if IE 6]> <link rel="stylesheet" type="text/css" href="css/styleIE6.css"> <![endif]--> <!--[if IE 7]> <link rel="stylesheet" type="text/css" href="css/styleIE7.css"> <![endif]--> <!--[if IE 8]> <link rel="stylesheet" type="text/css" href="css/styleIE8.css"> <![endif]--> <script src="scripts/jquery.js" type="text/javascript"></script> <script src="scripts/jquery.lazyload.js" type="text/javascript"></script> <script type="text/javascript">$(function() { $("img").lazyload({ effect:"fadeIn" }); }); </script> </head> <body> <div id="background_left"></div> <div id="wrapper"> <? include("block/header.php"); include("block/left_menu.php"); echo("<div id='wrapper_product_view_cat'>"); ?> <? echo (" <div class='breadcrumps'> <p> <a href='http://la-vittoria/index.php'>Главная</a> › <a href='catalog.php'>Каталог</a> › ".$myrow_meta["name"]." </p> </div> "); ?> <? echo (" ".$myrow_tovar["description"]." "); function getMinPriceById($id) { $t=mysql_query(" SELECT MIN(shop_prices.value) as value,shop_itemimages.filename FROM shop_prices INNER JOIN shop_items ON shop_items.item_id=shop_prices.item_id LEFT JOIN shop_itemimages ON shop_itemimages.item_id=shop_prices.item_id WHERE shop_items.owner_id='$id'"); if(mysql_num_rows($t)) { $result=mysql_fetch_array($t); return $result; } else return false; } $result_tovar = mysql_query (" SELECT shop_items.id, shop_items.name, shop_items.article, shop_items.item_id, shop_itemimages.filename, shop_prices.value FROM shop_items LEFT JOIN shop_prices ON shop_prices.item_id=shop_items.item_id LEFT JOIN shop_itemimages ON shop_itemimages.item_id=shop_items.item_id WHERE shop_items.parent_group_id='$group_id' AND owner_id ='0' GROUP BY shop_items.item_id ORDER BY `shop_items`.`article` LIKE 'Л%' DESC, `shop_items`.`article` LIKE 'Л%' ASC, `shop_items`.`article` "); $myrow_tovar = mysql_fetch_assoc($result_tovar); do { if(trim($myrow_tovar["value"])=='') { $arr=getMinPriceById($myrow_tovar["item_id"]); $myrow_tovar["value"]=$arr['value']; $myrow_tovar["filename"]=$arr['filename']; } $myrow_tovar["value"]=(int)$myrow_tovar["value"]; echo (" <a href='view_model.php?item_id=".$myrow_tovar["item_id"]." '> <div class='model'> <img src='http://la-vittoria.ru/1c/catalog/".$myrow_tovar["filename"]."' width='163' height='250' /> ".$myrow_tovar["name"]." <p class='price'>".$myrow_tovar["value"]." руб</p> </div> </a> "); } while($myrow_tovar = mysql_fetch_assoc ($result_tovar)); echo("</div>"); include("block/footer_menu.php"); include("block/footer_contakts.php"); include("block/footer_copyright.php"); ?> </div> </body> </html> проблема не в отдельной таблице цен, а в том что довольно дорогой запрос вызывается в цикле. Добавлено спустя 2 минуты 31 секунду: золотое правило оптимизации: выноси из цикла всё, что можно вынести, а что нельзя — упрощай. для начала поставь счетчики типа $start=microtime(true);...действие...$time=microtime(true)-$start; на каждый пункт, который хочешь улучшить Добавлено спустя 1 минуту 39 секунд: потом, зная картину бедствия в цифрах, пытайся её улучшить. шаг за шагом. это хороший квест. Добавлено спустя 2 минуты 42 секунды: p.s. do {} while() выдает попова Добавлено спустя 15 минут 12 секунд: p.p.s. тут вообще всё запущено и в плане запросов и в логике скрипта. shop_prices и shop_itemimages присутствуют в запросе, который перед циклом. но результаты затираются результатами функции, которая вызывается на каждой итерации цикла. это провал!!! нужно составить один запрос, где будет джойниться что-то похожее на запрос из функции, но с GROUP BY owner_id.