За последние 24 часа нас посетили 18538 программистов и 1670 роботов. Сейчас ищут 885 программистов ...

Ускорени работы каталога на php и mysql

Тема в разделе "PHP для новичков", создана пользователем SergeyEremeev, 7 дек 2013.

  1. SergeyEremeev

    SergeyEremeev Новичок

    С нами с:
    6 окт 2013
    Сообщения:
    5
    Симпатии:
    0
    Привет!
    Имеется каталог товаров.
    В каждом разделе от 10 до 200 товаров.
    Так вот когда щелкаем по разделам где мало товаров 5 - 10 то вроде нормал, быстро открываются а вот если больших по 100 или 200 товаров тогда напряжно долго.
    Может быть как-то упростить запросы?
    Или может быть применить бесконечную прокрутку - это когда при скролинге подгружается по 10 моделей например.

    Посоветуйте пожалуйста что сделать...
    Вот ссылка на работу такого каталога:
    http://la-vittoria.ru/view_cat.php?parent_group_id=4e2f4b99 ... 15f2b8ef81

    Исходный код файла который выводит данный каталог:

    Код (Text):
    1.  
    2. <? include("block/bd.php");
    3. if (isset($_GET['group_id'])) {$group_id=$_GET['group_id'];}
    4. $group_id = $_GET['parent_group_id'];
    5. ?>
    6. <!DOCTYPE HTML>
    7. <html>
    8. <head>
    9. <meta charset="utf-8" />
    10. <title></title>
    11. <meta name="description" content=" " />
    12. <meta name="keywords" content=" " />
    13. <meta name='yandex-verification' content='44bea9583d5cd256' />
    14. <meta name="viewport" content="width=1100" />
    15. <link rel="stylesheet" href="css/reset.css" />
    16. <link rel="stylesheet" href="css/style.css" />
    17. <!--[if IE 6]>
    18. <link rel="stylesheet" type="text/css" href="css/styleIE6.css">
    19.  <![endif]-->
    20. <!--[if IE 7]>
    21. <link rel="stylesheet" type="text/css" href="css/styleIE7.css">
    22.  <![endif]-->
    23. <!--[if IE 8]>
    24. <link rel="stylesheet" type="text/css" href="css/styleIE8.css">
    25.  <![endif]-->
    26. <script src="scripts/jquery.js" type="text/javascript"></script>
    27. <script src="scripts/jquery.lazyload.js" type="text/javascript"></script>
    28.  
    29. <script type="text/javascript">$(function() {          
    30.           $("img").lazyload({
    31.          effect:"fadeIn"
    32.           });
    33.       });
    34. </script>
    35. </head>
    36.  
    37. <body>
    38. <div id="background_left"></div>
    39. <div id="wrapper">
    40. <?
    41. include("block/header.php");
    42. include("block/left_menu.php");
    43. echo("<div id='wrapper_product_view_cat'>");
    44. ?>
    45.        
    46.         <?
    47.         echo ("
    48.         <div class='breadcrumps'>
    49.         <p>
    50.         <a href='http://la-vittoria/index.php'>Главная</a> &#8250;
    51.         <a href='catalog.php'>Каталог</a> &#8250;
    52.         ".$myrow_meta["name"]."
    53.         </p>
    54.         </div>
    55.         ");
    56.         ?>
    57.        
    58.  
    59.  
    60.  
    61. <?
    62. echo (" ".$myrow_tovar["description"]." ");
    63.  
    64. function getMinPriceById($id)
    65. {
    66.     $t=mysql_query("
    67.     SELECT MIN(shop_prices.value) as value,shop_itemimages.filename  
    68.     FROM shop_prices
    69.     INNER JOIN shop_items ON shop_items.item_id=shop_prices.item_id
    70.     LEFT JOIN shop_itemimages ON shop_itemimages.item_id=shop_prices.item_id
    71.     WHERE shop_items.owner_id='$id'");
    72.    
    73.     if(mysql_num_rows($t))
    74.     {
    75.         $result=mysql_fetch_array($t);
    76.         return $result;
    77.     }
    78.         else return false;
    79. }
    80.  
    81.  
    82. $result_tovar = mysql_query ("
    83. SELECT
    84. shop_items.id,
    85. shop_items.name,
    86. shop_items.article,
    87. shop_items.item_id,
    88. shop_itemimages.filename,
    89. shop_prices.value
    90. FROM shop_items
    91.  
    92. LEFT JOIN shop_prices ON shop_prices.item_id=shop_items.item_id
    93. LEFT JOIN shop_itemimages ON shop_itemimages.item_id=shop_items.item_id
    94.  
    95. WHERE shop_items.parent_group_id='$group_id'
    96. AND owner_id ='0'
    97.  
    98. GROUP BY shop_items.item_id
    99. ORDER BY `shop_items`.`article` LIKE 'Л%' DESC, `shop_items`.`article` LIKE 'Л%' ASC, `shop_items`.`article`
    100. ");
    101. $myrow_tovar = mysql_fetch_assoc($result_tovar);
    102. do
    103. {
    104.       if(trim($myrow_tovar["value"])=='')
    105.       {
    106.       $arr=getMinPriceById($myrow_tovar["item_id"]);
    107.       $myrow_tovar["value"]=$arr['value'];
    108.       $myrow_tovar["filename"]=$arr['filename'];
    109.       }
    110.       $myrow_tovar["value"]=(int)$myrow_tovar["value"];
    111.    
    112.    
    113.     echo
    114.     ("
    115.       <a href='view_model.php?item_id=".$myrow_tovar["item_id"]." '>
    116.        <div class='model'>
    117.      <img src='http://la-vittoria.ru/1c/catalog/".$myrow_tovar["filename"]."' width='163' height='250' />
    118.       ".$myrow_tovar["name"]."
    119.       <p class='price'>".$myrow_tovar["value"]." руб</p>
    120.      </div>
    121.        </a>
    122.      ");
    123. }
    124. while($myrow_tovar = mysql_fetch_assoc ($result_tovar));
    125.      
    126. echo("</div>");
    127.  
    128. include("block/footer_menu.php");
    129. include("block/footer_contakts.php");
    130. include("block/footer_copyright.php");
    131. ?>
    132. </div>
    133. </body>
    134. </html>
     
  2. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
  3. SergeyEremeev

    SergeyEremeev Новичок

    С нами с:
    6 окт 2013
    Сообщения:
    5
    Симпатии:
    0
    Когда вывожу ТОЛЬКО артикулы или имена моделей то все нормально.
    Когда через php функцию вытаскиваю из других таблиц цену и путь к фотке то все начинаются тормоза.
    Даже цены достаточно.
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Структуру бд с ключами покажи
     
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    А зачем цену на товары хранить в отдельной таблице? У товара может быть несколько цен в магазине?
     
  6. SergeyEremeev

    SergeyEremeev Новичок

    С нами с:
    6 окт 2013
    Сообщения:
    5
    Симпатии:
    0
    В отдельной так как у нас разные цвета товаров стоят по разному, от этого ни уйти ни куда
     
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    разметка синтаксиса очень помогает! используй [ code=php ] [ /code ]— без пробелов, конечно
    Код (PHP):
    1. <? include("block/bd.php"); 
    2. if (isset($_GET['group_id'])) {$group_id=$_GET['group_id'];}
    3. $group_id = $_GET['parent_group_id'];
    4. ?>
    5. <!DOCTYPE HTML>
    6. <html>
    7. <head>
    8. <meta charset="utf-8" />
    9. <title></title>
    10. <meta name="description" content=" " />
    11. <meta name="keywords" content=" " />
    12. <meta name='yandex-verification' content='44bea9583d5cd256' />
    13. <meta name="viewport" content="width=1100" />
    14. <link rel="stylesheet" href="css/reset.css" />
    15. <link rel="stylesheet" href="css/style.css" />
    16. <!--[if IE 6]>
    17. <link rel="stylesheet" type="text/css" href="css/styleIE6.css">
    18.  <![endif]-->
    19. <!--[if IE 7]>
    20. <link rel="stylesheet" type="text/css" href="css/styleIE7.css">
    21.  <![endif]-->
    22. <!--[if IE 8]>
    23. <link rel="stylesheet" type="text/css" href="css/styleIE8.css">
    24.  <![endif]-->
    25. <script src="scripts/jquery.js" type="text/javascript"></script>
    26. <script src="scripts/jquery.lazyload.js" type="text/javascript"></script>
    27.  
    28. <script type="text/javascript">$(function() {          
    29.           $("img").lazyload({
    30.        effect:"fadeIn"
    31.           });
    32.       });
    33. </script>
    34. </head>
    35.  
    36. <body>
    37. <div id="background_left"></div> 
    38. <div id="wrapper">
    39. <? 
    40. include("block/header.php"); 
    41. include("block/left_menu.php"); 
    42. echo("<div id='wrapper_product_view_cat'>");
    43. ?>
    44.         
    45.       <? 
    46.       echo ("
    47.         <div class='breadcrumps'>
    48.       <p>
    49.       <a href='http://la-vittoria/index.php'>Главная</a> ›
    50.       <a href='catalog.php'>Каталог</a> › 
    51.         ".$myrow_meta["name"]."
    52.         </p>
    53.       </div>
    54.         "); 
    55.       ?>
    56.       
    57.  
    58.  
    59.  
    60. <?
    61. echo (" ".$myrow_tovar["description"]." ");
    62.  
    63. function getMinPriceById($id)
    64. {
    65.    $t=mysql_query("
    66.    SELECT MIN(shop_prices.value) as value,shop_itemimages.filename  
    67.    FROM shop_prices 
    68.    INNER JOIN shop_items ON shop_items.item_id=shop_prices.item_id 
    69.    LEFT JOIN shop_itemimages ON shop_itemimages.item_id=shop_prices.item_id
    70.    WHERE shop_items.owner_id='$id'");
    71.    
    72.    if(mysql_num_rows($t))
    73.    {
    74.       $result=mysql_fetch_array($t);
    75.       return $result;
    76.    } 
    77.       else return false;
    78. }
    79.  
    80.  
    81. $result_tovar = mysql_query ("
    82. SELECT 
    83. shop_items.id, 
    84. shop_items.name,
    85. shop_items.article,
    86. shop_items.item_id,
    87. shop_itemimages.filename,
    88. shop_prices.value
    89. FROM shop_items 
    90.  
    91. LEFT JOIN shop_prices ON shop_prices.item_id=shop_items.item_id
    92. LEFT JOIN shop_itemimages ON shop_itemimages.item_id=shop_items.item_id
    93.  
    94. WHERE shop_items.parent_group_id='$group_id
    95. AND owner_id ='0'
    96.  
    97. GROUP BY shop_items.item_id
    98. ORDER BY `shop_items`.`article` LIKE 'Л%' DESC, `shop_items`.`article` LIKE 'Л%' ASC, `shop_items`.`article`
    99. ");
    100. $myrow_tovar = mysql_fetch_assoc($result_tovar);
    101. do
    102. {
    103.       if(trim($myrow_tovar["value"])=='') 
    104.       {
    105.       $arr=getMinPriceById($myrow_tovar["item_id"]);
    106.       $myrow_tovar["value"]=$arr['value'];
    107.       $myrow_tovar["filename"]=$arr['filename'];
    108.       }
    109.       $myrow_tovar["value"]=(int)$myrow_tovar["value"];
    110.     
    111.     
    112.    echo
    113.    ("
    114.       <a href='view_model.php?item_id=".$myrow_tovar["item_id"]." '>
    115.        <div class='model'>
    116.     <img src='http://la-vittoria.ru/1c/catalog/".$myrow_tovar["filename"]."' width='163' height='250' />
    117.       ".$myrow_tovar["name"]."
    118.       <p class='price'>".$myrow_tovar["value"]." руб</p>
    119.     </div>
    120.        </a>
    121.     ");
    122. }
    123. while($myrow_tovar = mysql_fetch_assoc ($result_tovar));
    124.      
    125. echo("</div>");
    126.  
    127. include("block/footer_menu.php"); 
    128. include("block/footer_contakts.php"); 
    129. include("block/footer_copyright.php"); 
    130. ?>
    131. </div>
    132. </body>
    133. </html>
    проблема не в отдельной таблице цен, а в том что довольно дорогой запрос вызывается в цикле.

    Добавлено спустя 2 минуты 31 секунду:
    золотое правило оптимизации: выноси из цикла всё, что можно вынести, а что нельзя — упрощай.
    для начала поставь счетчики типа $start=microtime(true);...действие...$time=microtime(true)-$start; на каждый пункт, который хочешь улучшить

    Добавлено спустя 1 минуту 39 секунд:
    потом, зная картину бедствия в цифрах, пытайся её улучшить. шаг за шагом. это хороший квест. :D

    Добавлено спустя 2 минуты 42 секунды:
    p.s. do {} while() выдает попова

    Добавлено спустя 15 минут 12 секунд:
    p.p.s. тут вообще всё запущено и в плане запросов и в логике скрипта.

    shop_prices и shop_itemimages присутствуют в запросе, который перед циклом. но результаты затираются результатами функции, которая вызывается на каждой итерации цикла. это провал!!!

    нужно составить один запрос, где будет джойниться что-то похожее на запрос из функции, но с GROUP BY owner_id.