0

我在本地机器上。我只在插入|创建|删除后第一次加载页面时收到该错误。然后它加载非常快。然后,如果我修改数据库,第一次(有时是第二次)访问页面时会出现该错误。我不明白。

为什么我在修改数据库后第一次访问该站点时才收到该错误?

$sth = $this->dbh->prepare("SELECT g.t_tree_c_parent AS gp ,h.t_tree_c_parent AS hp
                FROM t_tree a INNER JOIN (t_data b, t_data c, t_tree d, t_data e, t_data f, t_tree g, t_tree h, t_tree i) 
                ON a.t_tree_c_child=b.t_data_c_space
                AND b.t_data_c_object=c.t_data_c_object
                AND c.t_data_c_space=d.t_tree_c_child
                AND d.t_tree_c_parent=e.t_data_c_object
                AND e.t_data_c_space=f.t_data_c_object
                AND f.t_data_c_space=g.t_tree_c_child
                AND g.t_tree_c_parent=h.t_tree_c_child
                AND e.t_data_c_space=i.t_tree_c_child
                AND i.t_tree_c_parent=?
                WHERE a.t_tree_c_child=?");
$sth->execute(array($this->glob['children'], $child)); //  <- LINE:183

我将拆分该查询以进行测试。但我问也许我错过了一些东西。

@jcho360 要求更新:

CREATE TABLE `t_data` (
`t_data_c_space` VARCHAR(50) NOT NULL DEFAULT '0.00000000000',
`t_data_c_object` VARCHAR(50) NULL DEFAULT NULL,
`t_data_c_timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`t_data_c_space`)
 )
COLLATE='utf8_general_ci'
ENGINE=InnoDB;

CREATE TABLE `t_tree` (
`t_tree_c_parent` VARCHAR(50) NOT NULL,
`t_tree_c_child` VARCHAR(50) NOT NULL,
`t_tree_c_timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;

在 HeidiSQL 中为孩子(在项目中,此查询在递归函数中):

第一次在 db 中进行小更新后第一次为 2.137 秒,然后为 0.000 秒

我开始认为这是 Leandro Barreto 建议的 mysql 缓存。

4

1 回答 1

1

我会在这里给你一个疯狂的猜测:数据库缓存。

第一次执行页面时,查询不会缓存在数据库中,因此需要更长的时间,从而超过了 PHP 的时间限制。

在其他时候,查询要快得多。

如前所述,您可以拆分查询,也可以尝试增加脚本的时间限制:

set_time_limit(0); //No time limit
set_time_limit(60); //60 seconds

可以肯定的是,您可以使用来清理数据库缓存并始终使用它,因此您将始终在清理缓存上运行页面。

于 2012-11-29T13:47:19.077 回答