вопрос
Так как нагрузка на сервер будет большая я задумался над оптимизацией запросов. Насколько я понял при загрузке ajax комментариев мы сначала выбираем все строки из БД по запросу, а затем выводим только первые несколько(сколько нужно), что уже сокращает обработку всех строк процессором за исключением указанных. Остальные подгружаем делая запрос уже с LIMIT, где конкретно выбираем из БД откуда и по куда брать строки, что очень сильно снижает нагрузку. Все ли я верно подметил?
В классе templates.class есть строка, которая разбивает результаты запроса и если я не ошибаюсь, то она просто выбирает срез массива те, самые comments_per_pages, что эквиваленто моему запросу с циклом
Мой код:
В другом файле делаю запрос запрос:
Спасибо, за ваше внимание!
В классе templates.class есть строка, которая разбивает результаты запроса и если я не ошибаюсь, то она просто выбирает срез массива те, самые comments_per_pages, что эквиваленто моему запросу с циклом
while( $i db->get_row( $sql_result ) ) {
$rows[$row['id']] = array ();
foreach ( $row as $key => $value ) {
if ($key == "parent" AND $value == 0 ) $value = false;
$rows[$row['id']][$key] = $value;
}
}
if ( $build_full_news AND count($rows) ) {
$this->total_comments = count($rows);
if( $this->cstart total_comments ) $rows = array_slice($rows, $this->cstart, $this->comments_per_pages, true); else $rows = array();
}
Мой код:
$get_annotation = "SELECT * FROM annotation_post where user_id= '".$row['user_id']."' ORDER BY annotation_post.id ASC";
$user_id = $row['user_id'];//Для передачи в следующий скрипт на подгрузку
$output="";//Переменная для вывода данных
$handleQuery1 = $db->query( $get_annotation );
$cont = $handleQuery1->num_rows;
$pages = ceil($cont/5); //Количество страниц
$i=0;
while ( $i < 5) {
$row2 = $db->get_row($handleQuery1);
$temp = "<div class=\"annotation\">
<div class=\"annotation-title\">".$row2['title']."</div>
<div class=\"cited\"><a href=\"".$row2['full_link']."#load".$row2['id']."\">".$row2['cited']."</a></div>
<div class=\"annotation-name\">".$row2['autor']."
</div><div class=\"annotation-text\">".$row2['full_story']."
</div>
<div class=\"annotation-rating\">
<div class=\"rate_like-dislike\">
<div class=\"rate_like-dislike_in\">
[rating-plus]<span class=\"plus_icon\" title=\"Нравится\"><span>+</span></span>[/rating-plus]
[rating-minus]<span class=\"plus_icon minus\" title=\"Не нравится\"><span>-</span></span>[/rating-minus]
</div>
<span class=\"grey\">{rating}</span>
</div>
</div>
</div>";
$temp = str_replace( '{rating}', ShowCommentsRatingAnnotation( $row2['id'], $row2['rating'], $row2['vote_num'], $user_group[$member_id['user_group']]['allow_rating'] ), $temp);
$temp = str_replace( '[rating-plus]', "<a href=\"#\" onclick=\"doRateAnnotation('plus', '{$row2['id']}'); return false;\" >", $temp);
$temp = str_replace( '[/rating-plus]', "</a>", $temp);
$temp = str_replace( '[rating-minus]', "<a href=\"#\" onclick=\"doRateAnnotation('minus', '{$row2['id']}'); return false;\" >", $temp);
$temp = str_replace( '[/rating-minus]', "</a>", $temp);
$output=$output.$temp;
$i++;
}
$db->free($handleQuery1);
$output = $output."
<script type=\"text/javascript\" src=\"/engine/classes/min/index.php?charset=windows-1251&f=engine/classes/js/waypoints.js,engine/classes/highslide/highslide.js&19\"></script>
<div class=\"ajax_comments_area\">
<div class=\"ajax_loaded_comments\">
<div class=\"ajax_comments_next\"></div>
</div>
</div>
<script type=\"text/javascript\">
<!--
var user_id= '{$user_id}';
var total_comments_pages= '{$pages}';
var current_comments_page= '1';
$(function(){
$('.ajax_comments_next').waypoint(function() {
if (current_comments_page < total_comments_pages ) {
$.waypoints('disable');
current_comments_page ++;
ShowLoading('');
$.get(dle_root + \"engine/ajax/prof.php\", { cstart: current_comments_page, user_id: user_id, skin: dle_skin, massact:'disable' }, function(data){
setTimeout(function() { $.waypoints('enable'); }, 300);
HideLoading('');
$(\".ajax_loaded_comments\").append(data.comments);
}, \"json\");
} else {
$.waypoints('destroy');
}
}, {
offset: 'bottom-in-view'
});
});
//-->
</script>";
$tpl->set( '{annatations}', $output);
В другом файле делаю запрос запрос:
$user_id = intval($_GET['user_id']);
$cstart = intval($_GET['cstart']);
$cstart2 = $cstart*5;//конец
$cstart = $cstart2-5; //начало
$limit = " LIMIT ".$cstart.",".$cstart2;
$get_annotation = "SELECT * FROM annotation_post where user_id= '".$user_id."' ORDER BY annotation_post.id ASC".$limit;
Спасибо, за ваше внимание!