我正在使用托管在 Google Compute Engine 上的 MySQL 数据库,并通过 PHP 从另一个计算引擎访问。
每当我跑
SHOW PROCESSLIST
Run Code Online (Sandbox Code Playgroud)
结果中大约有 5-6 个睡眠连接,这对我来说没问题,因为它不会降低系统的性能。但是每当网站上的流量很大时,睡眠连接就会增加到 100+,从而导致整个系统变慢。
我在网上查了一下,发现这些sleep连接都是open mysql connection waiting for command。
但是我在每次查询后关闭我的 SQL 连接。这是我如何使用 PHP 访问 MySQL DB 的示例。
function db_connect()
{
$host = "100.100.100.100"; // dummy
$username = "abc";
$pass = "1234";
$db = "database";
$connection = new mysqli($host, $username, $pass, $db);
$connection->set_charset("utf8");
return $connection;
}
function closeConnection($db)
{
$db->close();
}
function runQuery($query)
{
$db = db_connect();
$sql = $db->query($query);
closeConnection($db);
return $sql;
}
Run Code Online (Sandbox Code Playgroud)
我将 SQL 语句传递给 runQuery 函数,该函数打开一个新连接并在执行查询后关闭它。我知道为页面上的每个查询打开一个新连接会降低页面的性能,但这样我确信我不会打开任何连接。
尽管如此,当流量很高时,我会获得睡眠连接。
我在下面附上了 SHOW PROCESSLIST 的样本。
请帮我解决这个问题。