Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Большущая нагрузка на страничку
 
 автор: TetRiska   (12.07.2011 в 19:47)   письмо автору
15.7 Кб
 
 

SELECT a.`em_produce_name`,
               a.`em_produce_desc_short`,
               a.`em_produce_price_ua`,
               a.`em_produce_price_us`,
               a.`em_produce_price_eu`,
               a.`em_produce_image_sm`,
               a.`em_produce_year`,
               a.`em_produce_distance`,
               a.`em_produce_motohours`,
               a.`em_produce_flyhours`,
               a.`em_produce_valume`,
               a.`em_produce_country`,
               a.`em_produce_color`,
               a.`em_produce_maxspeed`,
               a.`em_produce_fuelflou`,
               a.`em_produce_tub`,
               a.`em_produce_data_upd`,
               a.`em_element_id`,
               a.`em_produce_url`, 
               a.`em_produce_subcategory` as pp_category_id,
               b.`em_category_name` as pp_category_name,
               a.`em_produce_group` as pp_rubrik_id,
               c.`em_category_name` as pp_rubrik_name,
               a.`em_brand_id` as pp_brand_id,
               d.`em_brand_name` as pp_brand_name,
               f.`em_city_id` as pp_city_id,
               p.`em_city_name` as pp_city_name,
               e.`em_produce_stat_overal`,
               f.`em_company_profile_url`,
               f.`em_company_name`,
               f.`em_company_plogo`,
               g.`em_package_name`,
               g.`em_package_type`
        FROM `em_produce` a 
        LEFT JOIN `em_category` b ON (b.`em_category_id` = a.`em_produce_subcategory` AND b.`em_category_access` = 'y' AND b.`em_category_deleted` = 'n')
        LEFT JOIN `em_category` c ON (c.`em_category_id` = a.`em_produce_group` AND c.`em_category_access` = 'y' AND c.`em_category_deleted` = 'n')
        LEFT JOIN `em_brand` d ON (d.`em_brand_id` = a.`em_brand_id` AND d.`em_brand_access` = 'y' AND d.`em_brand_deleted` = 'n')
        LEFT JOIN `em_produce_stat` e ON (e.`em_produce_id` = a.`em_produce_id`)    
        JOIN `em_company` f ON (f.`em_company_id` = a.`em_company_id` AND f.`em_company_access` = 'y' AND f.`em_company_deleted` = 'n')    
        JOIN `em_package` g ON (g.`em_package_id` = f.`em_package_id`)
        LEFT JOIN `em_city` p ON (p.`em_city_id` = f.`em_city_id`)
        WHERE a.`em_produce_direct` = ".$res['result']['em_category_id'][0]."
        AND a.`em_produce_access` = 'y'
        AND a.`em_produce_deleted` = 'n'
        ORDER BY g.`em_package_weight` DESC, e.`em_produce_stat_overal` DESC

Получился такой не малый запрос, для выборки всех нужных данных для одной страницы. Ограничение на вывод - LIMIT, использовать не стал, т.к. я формирую постраничку из всей выборки, после чего разбиваю по 15 на страничку. Получается, по всем критериям из таблицы em_produce мне отбирает 5202 записи, всего в таблице их 26 000 записей и их количество постоянно растет. Время выполнения самого запроса 1.9-2.2секунды , а загрузка самой страницы 8 секунд. Это катастрофически недопустимо в целях продвижения в Интернете, и вообще, кто будет дожидаться загрузки "тяжелой" странички. Всего страниц вышло 521. Была идея сделать вывод не 521 страниц, а 100, тогда быстрей грузится на секунды 3, но все равно долго. Какие могут быть соображения? Прикрепил дамы всех таблиц, с которыми веду работу.

Прошу помощи, т.к. задача должна быть как можно быстрей выполнена.

  Ответить  
 
 автор: Valick   (12.07.2011 в 20:39)   письмо автору
 
   для: TetRiska   (12.07.2011 в 19:47)
 

Ограничение на вывод - LIMIT, использовать не стал, т.к. я формирую постраничку из всей выборки
а смысл? после первой страницы при переходе на другую происходит перезагрузка?
у вас 8 таблиц в запросе может все-таки не правильно организована база?

  Ответить  
 
 автор: TetRiska   (12.07.2011 в 21:56)   письмо автору
 
   для: Valick   (12.07.2011 в 20:39)
 

происходит, базу не я делал, таблицы приложил

  Ответить  
 
 автор: Valick   (12.07.2011 в 22:03)   письмо автору
 
   для: TetRiska   (12.07.2011 в 21:56)
 

если перезагружается тогда какой смысл выбирать более 15-ти строк? это же мягко говоря нерационально

  Ответить  
 
 автор: TetRiska   (12.07.2011 в 23:54)   письмо автору
 
   для: Valick   (12.07.2011 в 22:03)
 

я Вас не пойму, о чем речь вообще?

идет выборка по критериям...выбирается 5202 записи и строится постраничка...на каждой страничке 15 записей....при хождении по страницам идет та же выборка данных только уже выбирается не 1-15, а 15-30 и тд

  Ответить  
 
 автор: cheops   (13.07.2011 в 00:25)   письмо автору
 
   для: TetRiska   (12.07.2011 в 19:47)
 

Очень много объединений, даже если индексы выстроены правильно, могут быть задержки... кэшируйте результат, создавайте таблицу с этими данными без WHERE-условия и выбирайте данные из этой кэшируемой таблицы, вычисленной заранее.

  Ответить  
 
 автор: TetRiska   (13.07.2011 в 11:12)   письмо автору
 
   для: cheops   (13.07.2011 в 00:25)
 

вот мой пример, который я крапал для выборки данных, кажись не все всё поняли
$sql5 = "
        SELECT a.`em_produce_name`,
               a.`em_produce_desc_short`,
               a.`em_produce_price_ua`,
               a.`em_produce_price_us`,
               a.`em_produce_price_eu`,
               a.`em_produce_image_sm`,
               a.`em_produce_year`,
               a.`em_produce_distance`,
               a.`em_produce_motohours`,
               a.`em_produce_flyhours`,
               a.`em_produce_valume`,
               a.`em_produce_country`,
               a.`em_produce_color`,
               a.`em_produce_maxspeed`,
               a.`em_produce_fuelflou`,
               a.`em_produce_tub`,
               a.`em_produce_data_upd`,
               a.`em_element_id`,
               a.`em_produce_url`, 
               a.`em_produce_subcategory` as pp_category_id,
               b.`em_category_name` as pp_category_name,
               a.`em_produce_group` as pp_rubrik_id,
               c.`em_category_name` as pp_rubrik_name,
               a.`em_brand_id` as pp_brand_id,
               d.`em_brand_name` as pp_brand_name,
               f.`em_city_id` as pp_city_id,
               p.`em_city_name` as pp_city_name,
               e.`em_produce_stat_overal`,
               f.`em_company_profile_url`,
               f.`em_company_name`,
               f.`em_company_plogo`,
               g.`em_package_name`,
               g.`em_package_type`
        FROM `em_produce` a 
        LEFT JOIN `em_category` b ON (b.`em_category_id` = a.`em_produce_subcategory` AND b.`em_category_access` = 'y' AND b.`em_category_deleted` = 'n')
        LEFT JOIN `em_category` c ON (c.`em_category_id` = a.`em_produce_group` AND c.`em_category_access` = 'y' AND c.`em_category_deleted` = 'n')
        LEFT JOIN `em_brand` d ON (d.`em_brand_id` = a.`em_brand_id` AND d.`em_brand_access` = 'y' AND d.`em_brand_deleted` = 'n')
        LEFT JOIN `em_produce_stat` e ON (e.`em_produce_id` = a.`em_produce_id`)    
        JOIN `em_company` f ON (f.`em_company_id` = a.`em_company_id` AND f.`em_company_access` = 'y' AND f.`em_company_deleted` = 'n')    
        JOIN `em_package` g ON (g.`em_package_id` = f.`em_package_id`)
        LEFT JOIN `em_city` p ON (p.`em_city_id` = f.`em_city_id`)
        WHERE a.`em_produce_direct` = ".$res['result']['em_category_id'][0]."
        AND a.`em_produce_access` = 'y'
        AND a.`em_produce_deleted` = 'n'
        ORDER BY g.`em_package_weight` DESC, e.`em_produce_stat_overal` DESC
        ";
        
$res5 = select_query($sql5);

$goods    = '';
$navigate = '';

if($res5['count'] != 0){    
    $page     = isset($_GET['page']) && $_GET['page'] > 0 ? intval($_GET['page']) : 1;
    $per_page = 10;
    $path     = 'dir/'.$dir;
    $total    = (($$res5['count'] - 1) / $per_page) + 1;
    $total    =  intval($total);
    if($page > $total) $page = $total;
    
    $from = ($page-1)*$per_page;
    $to   = $page*$per_page;
    $to   = ($to > $$res5['count']) ? $$res5['count'] : $to;
    
    for($g=$from;$g<$to;$g++){
        $goods .= strtr(file_get_contents(PATH_PATTERN . RUBRIC_GOODS_CONTENT_TPL), array(
            .............
        ));
    }
    $navigate = navigate($page, $total, $path);
}
$content_tpl = strtr(file_get_contents(PATH_PATTERN . CONTENT_TPL), array(
    '{GOODS}'            => $goods,
    '{NAVIGATE}'         => $navigate
));

в приложении есть дамп таблиц, не могли бы Вы посмотреть индексы, все ли верно?
до кеширования пока нет времени, нужно еще разобраться как с ним корректно работать
создавать таблицу на каком этапе уже с готовым результатом отборки? или это к кешированию относится?

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования