是否可以在PHP PDO准备语句中设置innodb_stats_on_metadata?

时间:2013-11-25 14:38:38

标签: php mysql pdo innodb prepare

我使用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?

1 个答案:

答案 0 :(得分:1)

从语句中删除单词GLOBAL。它肯定不会让没有root权限的用户设置GLOBAL状态变量。