php - PDO 插入查询减慢网站速度

标签 php mysql nginx pdo innodb

在我的网站上,我编写了一个函数来显示我每天有多少唯一身份访问者和多少综合浏览量。

问题是有时插入查询需要永远,在 InnoDB 中没有 DELAYED INSERT 函数。

编辑:它使用的是 InnoDB,我的意思是加载时间长是 6 秒左右,而不是 0.1-0.5 秒。一旦我删除日志记录,网站就会快得多。

下面的 $b 数组包含浏览器信息,但根据 XHProf,它的 PDO 查询执行时间很长。

插入代码是这样的:

$values = array(
        'time' => time(),
        'ip' => $_SERVER['REMOTE_ADDR'],
        'page' => rtrim((isset($_GET['q']) ? $_GET['q'] : 'index'), '/'),
        'browser' => $b[11][0] . ' ' . $b[11][1],
        'os' => $uos,
        'referred' => (isset($_SERVER['HTTP_REFERER']) && !preg_match('|^' . Config::getValue('site', 'url') . '|', $_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''),
    );

    $this->table->insert($values);

和插入函数代码:

public function insert($table, $data) {
    ksort($data);

    $fieldNames = implode('`, `', array_keys($data));
    $fieldValues = ':' . implode(', :', array_keys($data));

    $sth = $this->prepare('INSERT INTO ' . $table . '(`' . $fieldNames . '`) VALUES (' . $fieldValues . ');');

    foreach ($data as $key => $value) {
        $sth->bindValue(':' . $key, $value);
    }

    $sth->execute();
}

最佳答案

一个小的优化。您进行绑定(bind)的方式可以摆脱 foreach 语句并直接传递数组以执行。 PDO 会将数组键映射到您在 prepare 语句中创建的 :binding 名称。

$sth->execute($data);

也就是说,您应该查看 mysql 中的慢速查询日志,看看发生了什么。即使您使用的是 Innodb,也有 Innodb 会锁定表的情况。这可能就是插入有时需要很长时间的原因。您可以将慢速查询阈值降低到 3 秒左右以捕获查询。日志会告诉您每个阶段(即锁定)花费了多少时间。

关于php - PDO 插入查询减慢网站速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9881222/

相关文章:

mysql - 使用 pgloader 将 mysql 迁移到 postgres

mysql - 如何解决 MySQL 存储人名的困境,同时保持可辨别性和对相似名字的搜索?

php - MySQL 从不同表中选择与单行链接的照片

shell - Nginx - 密码保护目录

symfony - 使用 Puppet/Nginx 配置程序添加重写位置

PHP:如何使用 echo 获取 $ 进行打印

javascript - 从表单条目追加到 JSON 文件

php - 分页和 $_POST

javascript - 根据他们的物理位置计算可能的旅程匹配

ruby-on-rails - 在 Ruby on Rails 生产服务器的 Passenger 之前错误地安装了 Nginx