gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 07:45:41 24 4
gpt4 key购买 nike

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

问题是有时插入查询需要永远,在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com