MySQL 中的睡眠连接过多

Vit*_*yal 5 mysql

我正在使用托管在 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 的样本。

流量高时的示例 SHOW PROCESSLIST 结果

请帮我解决这个问题。