|
 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, но все равно долго. Какие могут быть соображения? Прикрепил дамы всех таблиц, с которыми веду работу.
Прошу помощи, т.к. задача должна быть как можно быстрей выполнена. | |
|
|
|
|
|
|
|
для: TetRiska
(12.07.2011 в 19:47)
| | Ограничение на вывод - LIMIT, использовать не стал, т.к. я формирую постраничку из всей выборки
а смысл? после первой страницы при переходе на другую происходит перезагрузка?
у вас 8 таблиц в запросе может все-таки не правильно организована база? | |
|
|
|
|
|
|
|
для: Valick
(12.07.2011 в 20:39)
| | происходит, базу не я делал, таблицы приложил | |
|
|
|
|
|
|
|
для: TetRiska
(12.07.2011 в 21:56)
| | если перезагружается тогда какой смысл выбирать более 15-ти строк? это же мягко говоря нерационально | |
|
|
|
|
|
|
|
для: Valick
(12.07.2011 в 22:03)
| | я Вас не пойму, о чем речь вообще?
идет выборка по критериям...выбирается 5202 записи и строится постраничка...на каждой страничке 15 записей....при хождении по страницам идет та же выборка данных только уже выбирается не 1-15, а 15-30 и тд | |
|
|
|
|
|
|
|
для: TetRiska
(12.07.2011 в 19:47)
| | Очень много объединений, даже если индексы выстроены правильно, могут быть задержки... кэшируйте результат, создавайте таблицу с этими данными без WHERE-условия и выбирайте данные из этой кэшируемой таблицы, вычисленной заранее. | |
|
|
|
|
|
|
|
для: 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
));
|
в приложении есть дамп таблиц, не могли бы Вы посмотреть индексы, все ли верно?
до кеширования пока нет времени, нужно еще разобраться как с ним корректно работать
создавать таблицу на каком этапе уже с готовым результатом отборки? или это к кешированию относится? | |
|
|
|
|