【发布时间】:2012-03-26 23:10:58
【问题描述】:
在我的网站上,我编写了一个函数,可以显示我每天获得的唯一身份访问者数量和网页浏览量。
问题是有时插入查询需要很长时间,并且在 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();
}
【问题讨论】:
-
这个问题需要更多细节。什么插入查询? “永远”有多长?数据库架构是什么样的?
-
请发布表定义。如果主键不是自增且表很大,那么插入时涉及到的随机 I/O 可能是导致速度变慢的原因
-
我以为你想做
DELAYED INSERT,但你没有。所以我会说这需要更长的时间,因为你不做DELAYED INSERT,对吧? -
使用 INNODB 时不能有 DELAYED INSERT。
-
那是您的实际代码吗?
$this->table->insert($values);您从不提供$data,但您将实际值指定为$table参数
标签: php mysql nginx pdo innodb