减少MySQL进程的数量

时间:2013-01-19 23:15:59

标签: mysql process

我需要尝试了解MySQL进程/连接的工作原理。我用google搜索,并没有看到任何外行人的话,所以我在这里问。情况就是这样。

我们的主持人让我们为太多的MySQL进程感到悲伤"。我们在共享服务器上。我们被允许.2的服务器mySQL进程 - 他们声称是50个连接 - 他们说我们正在使用.56。

来自技术支持代表:

  

" MySQL进程数(平均值) - 0.59意味着您正在使用   共享服务器上可用的MySQL连接总数的0.59%。可接受的值是0.20,这是50个连接。 "

以下是我们正在运行的内容:

Zen Cart:           1.5.1  35K products. Auto updating of 1-20
                           products every 10 hours via cron.  
PHP version         5.3.16  
MySQL version       5.1.62-cll  
Architecture        i686  
Operating system    linux 

我们通常每天在网站上点击大约5000次,即使我在Google网站管理员工具中将抓取率设置为最低,Google bot仍然喜欢访问。

我希望有人可以根据主持人所说的内容向我解释MySQL进程。每当我问他们时,我都会得到一个模糊不清的模糊答案。每次访问者访问网站时是否创建了新的MySQL流程?这似乎不对。

根据技术,我们在那个特定时间使用了150个连接。

编辑: 这是zencart中的连接函数

  function connect($zf_host, $zf_user, $zf_password, $zf_database, $zf_pconnect = 'false', $zp_real = false) {
$this->database = $zf_database;
$this->user = $zf_user;
$this->host = $zf_host;
$this->password = $zf_password;
$this->pConnect = $zf_pconnect;
$this->real = $zp_real;
if (!function_exists('mysql_connect')) die ('Call to undefined function: mysql_connect().  Please install the MySQL Connector for PHP');
$connectionRetry = 10;
while (!isset($this->link) || ($this->link == FALSE && $connectionRetry !=0) )
{
  $this->link = @mysql_connect($zf_host, $zf_user, $zf_password, true);
  $connectionRetry--;
}
if ($this->link) {
  if (@mysql_select_db($zf_database, $this->link)) {
    if (defined('DB_CHARSET') && version_compare(@mysql_get_server_info(), '4.1.0', '>=')) {
      @mysql_query("SET NAMES '" . DB_CHARSET . "'", $this->link);
      if (function_exists('mysql_set_charset')) {
        @mysql_set_charset(DB_CHARSET, $this->link);
      } else {
        @mysql_query("SET CHARACTER SET '" . DB_CHARSET . "'", $this->link);
      }
    }
    $this->db_connected = true;
    if (getenv('TZ') && !defined('DISABLE_MYSQL_TZ_SET')) @mysql_query("SET time_zone = '" . substr_replace(date("O"),":",-2,0) . "'", $this->link);
    return true;
  } else {
    $this->set_error(mysql_errno(),mysql_error(), $zp_real);
    return false;
  }
} else {
  $this->set_error(mysql_errno(),mysql_error(), $zp_real);
  return false;
}

1 个答案:

答案 0 :(得分:1)

我想知道连接池是否存在问题。尝试更改此行:

$this->link = @mysql_connect($zf_host, $zf_user, $zf_password, true);

到此:

$this->link = @mysql_connect($zf_host, $zf_user, $zf_password);

manual is useful here - 默认情况下,第四个参数为false,但是您的代码强制它为true,即使现有连接已经打开,也会创建一个新连接(这称为连接池) 并且不必要地保存创建新连接,即节省时间和内存。

我会提出一个警告:在第三方系统中修改核心代码总是需要仔细完成。 可能是他们选择的行为的原因,尽管评论的方式并不多。可能值得通过他们的支持渠道提出一个问题,看看它为什么会这样运作,以及他们是否可以考虑改变它。