Перейти к контенту
  • 0

Медленные SQL запросы


Big Jack

Вопрос

Народ, помогите разобраться. Хостер кричит, что моя БД создает большую нагрузку медленными запросами.при этом запросы немного отличаются, но занимающие времени по 160 секунд практически идентичны:

use 1gbua_num2;

SELECT COUNT(DISTINCT(t.tid)) as tcnt,

COUNT(DISTINCT(p.pid)) as pcnt FROM ibf_posts p, ibf_topics

t WHERE

p.post_date > 1164837600 AND p.topic_id=t.tid;

По форуму полазил, нашел подобную темку в разделе для IPB 2.2.2, но там вроде вина хостера была. Просто у меня уже пару месяцев такая ерунда:D

Адрес форума и его версия в подписи.

Ссылка на комментарий
Поделиться на других сайтах

Рекомендуемые сообщения

  • 0

Что выдает

EXPLAIN SELECT COUNT(DISTINCT(t.tid)) as tcnt,
COUNT(DISTINCT(p.pid)) as pcnt FROM ibf_posts p, ibf_topics
t WHERE p.post_date > 1164837600 AND p.topic_id=t.tid;

Ссылка на комментарий
Поделиться на других сайтах

  • 0
А что это запрос делает-то, зачем он нужен? (: Может заменить функционал чем-то другим?
Ссылка на комментарий
Поделиться на других сайтах

  • 0
Sannis, дык вот х его з... Запрос периодически повторяется... Подозреваю ботов конечно, но не могу понять откуда появился этот запрос...
Ссылка на комментарий
Поделиться на других сайтах

  • 0
Смена хостера поможет.
Средство, прям как топор от головной боли...

 

Не иронизируй. Это часто единственное средство.

Запрос у тебя нормальный. Если такой не нравится хостеру, значит хостера надо менять. Вот я и предложил.

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Понял, первый раз принял как шутку :D просто год уже на этом хосте и все было гуд...ладно, будут "наезжать" дальше, буду решать тогда кардинально ;)

Спасибо за помощь.

Ссылка на комментарий
Поделиться на других сайтах

  • 0
Sannis, дык вот х его з... Запрос периодически повторяется... Подозреваю ботов конечно, но не могу понять откуда появился этот запрос...

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

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Гы, ну вот, опять :D :

В вашем аккаунте зафиксировано превышение квоты

на загрузку сервера баз данных.

База данных, превышающая квоту: 1gbua_num2

 

Параметры запроса, вызывающего проблему:

(приводятся параметры одного из запросов)

 

Время исполнения, секунд - 45

Кол-во просмотренных строк - 7277

Запрос:

-------

use 1gbua_num2;

SELECT COUNT(DISTINCT(t.tid)) as tcnt,

COUNT(DISTINCT(p.pid)) as pcnt FROM ibf_posts p, ibf_topics t WHERE

 

p.post_date > 1164837600 AND p.topic_id=t.tid;

-------

Sannis, есть мысли откуда начинать поиск "глючного" мода?

Ссылка на комментарий
Поделиться на других сайтах

  • 0
Скачать все скрипты на локаль и поиском по файлвм в нормальном редактре искать COUNT(DISTINCT(t.tid)), на рабочем форуме искать будет трудно. Либо опишите где у вас выводится результат этого...
Ссылка на комментарий
Поделиться на других сайтах

  • 0
Ув. GiV, вы подскажете, что это может быть?

Сам запрос пытается посчитать количество уникальных тем и количество уникальных постов с какого-то момента времени. Собственно по EXPLAIN запросу видно, что индексы используются нормально, однако сам запрос стоило бы разделить на две части. В начале выделить уникальные посты, потом выбрать уникальные темы.

 

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

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Вот единственное место, где я нашел данную функцию... файлик http\sources\action_public\uportal.php

	//*********************************************/
//   Welcome Panel 
//*********************************************/
function do_welcomepanel()
{
	if ( $GLOBALS['block']['welcomepanel'] )
	{
		if ($this->ipsclass->member['id'])
		{
			$member = $this->ipsclass->member;
			$avatar_size = $member['avatar_size'];
			list($w,$h) = split("x","$avatar_size",2);

			$query10 = $this->ipsclass->DB->query("SELECT `starter_id` AS id, `starter_name` AS 
			name, COUNT(*) AS `num` FROM ibf_topics GROUP BY id ORDER BY num DESC 
			LIMIT 1");

			$row = $this->ipsclass->DB->fetch_row($query10);

			if($row[name] == null)
				$row[name] = None;

			$data['tt_id']	= $row[id];
			$data['tt_name']	= $row[name];
			$data['tt_num']	= $row[num];

			$query11 = $this->ipsclass->DB->query("SELECT `id`,`members_display_name`,`posts` FROM ibf_members 
			WHERE 1 ORDER BY `posts` DESC LIMIT 1");

			$row = $this->ipsclass->DB->fetch_row($query11);

			$data['tp_id']	= $row[id];
			$data['tp_name']	= $row[name];
			$data['tp_num']	= $row[posts];

			$query12 = $this->ipsclass->DB->query("SELECT COUNT(DISTINCT(t.tid)) as tcnt, 
			COUNT(DISTINCT(p.pid)) as pcnt FROM ibf_posts p, ibf_topics t WHERE 
			p.post_date < ".time()." AND p.post_date > 
			".$this->ipsclass->member['last_visit']." AND p.topic_id=t.tid");

			$row = $this->ipsclass->DB->fetch_row($query12);

			$data['topics_since']	= $row[tcnt];
			$data['posts_since']	= $row[pcnt];

			if ( ! is_array( $this->ipsclass->cache['stats'] ) )
			{
				$this->ipsclass->cache['stats'] = array();

				$this->ipsclass->DB->simple_exec_query( array( 'delete' => 'cache_store', 
				'where' => "cs_key='stats'" ) );

				$this->ipsclass->DB->do_insert( 'cache_store', array( 'cs_array' => 1, 
				'cs_key' => 'stats', 'cs_value' => 
				addslashes(serialize($this->ipsclass->cache['stats'])) ) );
			}

			$stats = $this->ipsclass->cache['stats'];

			//----------------------------------------
			// Update the most active count if needed
			//----------------------------------------

			if ($this->users_online > $stats['most_count'])
			{
				$stats['most_count']	= $this->users_online;
				$stats['most_date']	= time();

				$this->ipsclass->DB->do_update( 'cache_store',array( 'cs_array' => 1, 
				'cs_value' => addslashes(serialize($stats)) ),"cs_key='stats'");
			}

			$total_posts = $stats['total_replies'] + $stats['total_topics'];

			$total_posts= $this->ipsclass->do_number_format($total_posts);
			$stats['mem_count'] = $this->ipsclass->do_number_format($stats['mem_count']);
			$this->total_members  = $stats['mem_count'];

			//Start Total Topics

			$data['stats']['TOTAL_TOPICS'] = $stats['total_topics'];

			//End Total Topics

			//Start Total Members

			$data['stats']['MEM_COUNT'] = $stats['mem_count'];

			//End Total Members

			//Start Total Posts

			$data['stats']['TOTAL_POSTS'] = $total_posts;

			$data['stats']['TOTAL_REPLIES'] = $stats['total_replies'];

			//End Total Posts

			//Start Newest Member

			$data['stats']['LAST_MEM_ID'] = $stats['last_mem_id'];

			$data['stats']['LAST_MEM_NAME'] = $stats['last_mem_name'];

			//End Newest Member

			$this->ipsclass->offset_set = 0;
			$data['lastv'] = $this->ipsclass->get_date($this->ipsclass->member['last_visit'], LONG);
			$data['time'] = $this->ipsclass->get_date(time(), LONG);
			$data['avatar'] = $this->ipsclass->get_avatar( $member['avatar'], 1, 
			$member['avatar_size'] );

			//Replace Stuff

			$this->ipsclass->lang['welcomepanel'] = str_replace('<# MEMBER #>', 
			$member['name'], $this->ipsclass->lang['welcomepanel']);

			$output .= $this->ipsclass->compiled_templates['skin_uportal']->block_header(
				$this->collapse("welcomepanel"), "welcomepanel");

			$output .= $this->ipsclass->compiled_templates['skin_uportal']->welcomepanel($data);
			$output .= $this->ipsclass->compiled_templates['skin_uportal']->block_footer();

			return $output;
		}
		else
		{
			$this->ipsclass->offset_set = 0;
			$data['time'] = $this->ipsclass->get_date(time(), LONG);
			$today = mktime (0,0,0,date("M"),date("D"),date("Y"));

			$query13 = $this->ipsclass->DB->query("SELECT COUNT(DISTINCT(t.tid)) as tcnt, 
			COUNT(DISTINCT(p.pid)) as pcnt FROM ibf_posts p, ibf_topics t WHERE 
			p.post_date > ".$today." AND p.topic_id=t.tid");

			$row = $this->ipsclass->DB->fetch_row($query13);

			$data['topics_since']	= $row[tcnt];
			$data['posts_since']	= $row[pcnt];

			//Replace Stuff

			$this->ipsclass->lang['guestpanel'] = str_replace('<# BOARD URL #>', 
			$this->ipsclass->vars['board_url'], $this->ipsclass->lang['guestpanel']);

			$this->ipsclass->lang['guestpanel'] = str_replace('<# REGISTER #>', 
			$this->ipsclass->lang['register'], $this->ipsclass->lang['guestpanel']);

			$this->ipsclass->lang['guestpanel'] = str_replace('<# OR #>', 
			$this->ipsclass->lang['or'], $this->ipsclass->lang['guestpanel']);

			$this->ipsclass->lang['guestpanel'] = str_replace('<# LOGIN #>', 
			$this->ipsclass->lang['login'], $this->ipsclass->lang['guestpanel']);

			$output .= $this->ipsclass->compiled_templates['skin_uportal']->block_header(
				$this->collapse("welcomepanel"), "guestpanel");

			$output .= $this->ipsclass->compiled_templates['skin_uportal']->guestpanel($data);
			$output .= $this->ipsclass->compiled_templates['skin_uportal']->block_footer();

			return $output;
		}
	}
}

А как правльно заменить count на num_rows? (если конечно это помогает).

Если нет, то может просто убрать с Unreal Portal это Велкам-окно? Я ж так понимаю, что если не будет этой панели, не будет и запроса...

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Можете просто убрать отсюда

				$query12 = $this->ipsclass->DB->query("SELECT COUNT(DISTINCT(t.tid)) as tcnt, 
			COUNT(DISTINCT(p.pid)) as pcnt FROM ibf_posts p, ibf_topics t WHERE 
			p.post_date < ".time()." AND p.post_date > 
			".$this->ipsclass->member['last_visit']." AND p.topic_id=t.tid");

			$row = $this->ipsclass->DB->fetch_row($query12);

			$data['topics_since']	= $row[tcnt];
			$data['posts_since']	= $row[pcnt];

и в шаблоне удалить строки про столько-то постов и тем свашего последнего посещения в шаблоне этой панели(искать в шабоне самом по $row[tcnt]).

Ссылка на комментарий
Поделиться на других сайтах

  • 0
в шаблоне удалить строки про столько-то постов и тем свашего последнего посещения в шаблоне этой панели(искать в шабоне самом по $row[tcnt])
в шаблоне такая функция отсутствует. Не стал морочиться, отключил полностью панель, все равно без этих данных она теряет свой смысл.

Закомментил также и этот участок "на всякий случай" :D :

											   $query13 = $this->ipsclass->DB->query("SELECT COUNT(DISTINCT(t.tid)) as tcnt, 
			COUNT(DISTINCT(p.pid)) as pcnt FROM ibf_posts p, ibf_topics t WHERE 
			p.post_date > ".$today." AND p.topic_id=t.tid");

			$row = $this->ipsclass->DB->fetch_row($query13);

			$data['topics_since']	= $row[tcnt];
			$data['posts_since']	= $row[pcnt];

В любом случае, огромное спасибо за помощь! Sannis, уже не первый раз я ваш должник ;)

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить на вопрос...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.