Jump to content

Recommended Posts

Интересная ситуация: если к странице давно не обращались, время её генерации 500 и более мс, если загрузить страницу и через время её обновить, время уменьшится до 50-60 мс.
И дело именно в базе данных.
Что делать в этой ситуации? Как ускорить загрузку страниц?

Link to post
Share on other sites

Если к странице обращались не очень давно, то при повторном запросе данные выборки с базы берутся с кэша (именно кэша MYSQL). На хостингах размер кэша настроен по разному. Если сделали INSERT,UPDATE, DELETE то кэш для для таблиц сбрасывается.

Как ускорить загрузку страниц?

Нужно смотреть какие запросы больше всего грузят, и пытаться их переписать по другому. Если у Вас до 50 000 товаров - то должно всё нормально работать на "стандартных симпловских запросах", но опять таки это много зависит от хостинга

Если Вы смотрите page generation time: 0.500 seconds, то сюда входит не только время выполнения запросов, это общее время (php + mysql)

0.500 seconds - это нормально
Link to post
Share on other sites

смотрите тогда, запросы которые выполняются долго и попытайтесь их оптимизировать

Можете поэкспериментировать с настройками MYSQL, если имеете к им доступ

Link to post
Share on other sites

api/Database.php

	public function query()
{
	$time_start = microtime(true);
	
	$args = func_get_args();

	$q = call_user_func_array(array($this, 'placehold'), $args);
	if($this->link)
	{
		// В отладочном режиме ведем лог
		if($this->config->debug)
		{
			$start = microtime(true);
			$this->res_id = mysql_query($q, $this->link);
			$end = microtime(true);
			//$this->log->write('Executing query: '.$q."\r\nExecution time: ".($end-$start).' seconds');
			write_log('Executing query: '.$q."\r\nExecution time: ".($end-$start).' seconds');
		}
		else
		{
			$this->res_id = mysql_query($q, $this->link);
		}
	}
	else
	{
		$error_msg = "Could not execute query to database, wrong database link. [$q]";
		trigger_error($error_msg, E_USER_WARNING);
		return false;
	}
	if(!$this->res_id)
	{
		$error_msg = mysql_error($this->link).' ['.$q.']';
		trigger_error($error_msg, E_USER_WARNING);
		return false;
	}
	
	$time_end = microtime(true);
	$exec_time = round(($time_end-$time_start)*1000, 0);
	//print "$exec_time ms <br>$q<br><br>";
	
	return $this->res_id;
}




Сама ф-ция

$db_debug = '';
function write_log($s){
global $db_debug;
$s = str_replace(array("\n", "\r\n", "\t") ," ", $s)."\r\n";
$db_debug .= '<p>'.$s.'</p>';
if ($file = fopen('files/log/log.txt','a')){
	fwrite($file, $s);
	fclose($file);
}
}



и в index.php вывод
// Отладочная информация

if(1){	//print "<!--\r\n";	echo $db_debug;	$time_end = microtime(true);	$exec_time = $time_end-$time_start;	if(function_exists('memory_get_peak_usage'))		print "memory peak usage: ".memory_get_peak_usage()." bytes\r\n";  	print "page generation time: ".$exec_time." seconds\r\n";  	//print "-->";}


Если Вы не знаете структуры БД симплы или оптимизацию запросов к MYSQL, то лучше самому не править, обратитесь к специалисту.
Если у Вас товаров не слишком много до 50 000 вариантов товаров, и нет явно выраженного медленного запроса, то не целесообразно переписывать запросы. Лучше увеличить ресурсы MYSQL.
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...