我使用XML将部分MySQL数据库从一台服务器转移到另一台服务器。在这个XML中,我有我需要的所有数据库相关信息(数据和元数据)。一切正常,除了一件事 - 从information_schema 获取外键约束。
问题在于性能。获得大约100个约束需要大约7分钟的PHP脚本加载!但是,如果运行命令
SET GLOBAL innodb_stats_on_metadata = 0
使用约束查询(即在PHPMyAdmin中),如此
SET GLOBAL innodb_stats_on_metadata = 0;
SELECT * FROM information_schema.KEY_COLUMN_USAGE
一切都需要大约5秒钟就完成了。现在,这是一个巨大的节省时间,如果我可以按照以下方式使用它,那将是非常好的:
try{
$conn = $this->db->_pdo;
$conn->setAttribute(PDO::ATTR_AUTOCOMMIT, 0); //disable autocommit for transaction consistency
$conn->beginTransaction();
$this->db->_pdo->exec('SET GLOBAL innodb_stats_on_metadata = 0');
$query = $this->db->_pdo->prepare('
SELECT *
FROM information_schema.KEY_COLUMN_USAGE
WHERE REFERENCED_TABLE_NAME = ?');
$query->bindParam(1, $table, PDO::PARAM_STR);
$query->execute();
$keys = $query->fetchAll(PDO::FETCH_ASSOC);
$conn->commit();
$conn->setAttribute(PDO::ATTR_AUTOCOMMIT, 1);
if(!empty($keys)) return $keys; else return false;
}catch (Exception $e){
$conn->rollback();
echo 'Caught exception: ', $e->getMessage(), "\n";
return false;
}
问题是exec命令在这里被忽略,处理时间仍然很长。如果我把那个命令放到prepare中(在SELECT之前并用分号分隔),一切都以错误结束。
所以我的问题是:如何在使用事务和准备语句的PHP PDO结构中设置mysqli数据库参数innodb_stats_on_metadata?
答案 0 :(得分:1)
从语句中删除单词GLOBAL。它肯定不会让没有root权限的用户设置GLOBAL状态变量。