Не нравятся результаты поиска? Попробуйте другой поиск!
DLE FAQ » Все вопросы » MySQL » В чём соль подгрузки ajax комментариев, да и страниц?

В чём соль подгрузки ajax комментариев, да и страниц?


     03.04.2017    MySQL, Ламерские вопросы    216

вопрос
Так как нагрузка на сервер будет большая я задумался над оптимизацией запросов. Насколько я понял при загрузке ajax комментариев мы сначала выбираем все строки из БД по запросу, а затем выводим только первые несколько(сколько нужно), что уже сокращает обработку всех строк процессором за исключением указанных. Остальные подгружаем делая запрос уже с LIMIT, где конкретно выбираем из БД откуда и по куда брать строки, что очень сильно снижает нагрузку. Все ли я верно подметил?

В классе 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&amp;f=engine/classes/js/waypoints.js,engine/classes/highslide/highslide.js&amp;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; 


Спасибо, за ваше внимание!

Ответа пока нет


10 комментариев

dmfranklin
Юзер

dmfranklin - 3 апреля 2017 13:08 -

***Комментарий удален***

nowheremany
Эксперт

nowheremany - 3 апреля 2017 15:30 -

Если вы говорите про дерево - при текущей реализации делать постраничную навигации - смерти подобно. Вы не сможете построить нормальное дерево. Показывайте все комменты или исключайте дерево.

Благодарность принимаю тут Связь

dmfranklin
Юзер

dmfranklin - 3 апреля 2017 18:36 -

Нашел статью по постраничной навигации, это тоже самое, что и у меня, одно отличие - на ajax'e. Комментарии древовидные я вывожу только в полных новостях, и то я убрал глубину до единицы. В профиле будут отображаться аннотации(это что-то вроде комментариев, описание некоторых слов или фраз) пользователей к статьям с той же технологией ajax, которую я написал в этом вопросе. В этих аннотациях в бд хранится id, text, data и немного других данных, почти тоже самое, что и в "_post". Вывожу я только сами аннотации без их комментариев. Вывод самих комментариев к статье, а не к аннотации пользователя я хочу оставить оригинальным, т.е выводится только сам комментарий и ссылка на статью. То есть дерево строится будет только при просмотре полной новости, и то около 10-15 комментариев остальные подгрузятся по мере надобности. Вы написали "Вы не сможете построить нормальное дерево.", это почему же? Если взять главного родителя и относительного него строить по 5-10 комментариев, то все строиться, это же уже реализовано в dle.

nowheremany
Эксперт

nowheremany - 3 апреля 2017 20:37 -

Потому что
1. Если при постраничной навигации - у вас не будет родителя - не попадет в выборку - вы потеряете всю ветку.
2. Если вы хотите как в контакте - типа первые пару комментов ветки, показываются. остальные не отражаются - тут замучаешься с запросами - они будут слишком тяжёлые

Благодарность принимаю тут Связь

dmfranklin
Юзер

dmfranklin - 3 апреля 2017 21:12 -

Родитель при добавлении комментария всегда добавляется, значит прежде, чем строить дерево выбирается N-ое количество записей без родителя, а потом к каждой из них делается еще запрос с поиском детей. Тогда да, запросов будет много, я попозже посмотрю алгоритм в движке и разберу. Огромное вам спасибо, взял на заметку!)

nowheremany
Эксперт

nowheremany - 3 апреля 2017 22:43 -

В данном случае, если выбирать только родителей, сортировать по дате и отсекать по навигации - вы не увидите детей, которые добавились в старых ветках.

Если идти от детей на верх - не получится сделать например только 50 комментов на страницу - будет и 30 и 80. А так же запросами удавится сервер

Благодарность принимаю тут Связь

pavel31
Юзер

pavel31 - 3 апреля 2017 22:18 -

nowheremany, Почему не будет родителя? к примеру сделать комментарии как на youtube там много и родителей и их так сказать детей (ответов на комментарий) и навигацию в таком случае можно сделать, я так у себя в модуле сделала комментарии. С деревом и навигацией.

nowheremany
Эксперт

nowheremany - 3 апреля 2017 22:38 -

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

Благодарность принимаю тут Связь

pavel31
Юзер

pavel31 - 4 апреля 2017 21:20 -

nowheremany, А как же тогда здесь сделана навигация по комментариям??

nowheremany
Эксперт

nowheremany - 5 апреля 2017 09:15 -

Если не видно структуры БД и самого запроса - сказать не могу.

Смотрите сами - есть 3 ветки - 3 родителя по 9 детей, причем в каждой из веток - последний коммент новый. Надо вывести 20 записей.

Каким образом можно вывести? Просто логически опишите?

Благодарность принимаю тут Связь

Чтобы комментировать - войдите или зарегистрируйтесь на сайте

Похожие вопросы

наверх