Можно ли установить innodb_stats_on_metadata в оператор подготовки PHP PDO?
Я передаю часть базы данных MySQL с одного сервера на другой, используя XML. В этом 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 и разделяя точкой с запятой), все просто заканчивается ошибкой.
Итак, мой вопрос: как я могу установить параметр mysqli DB innodb_stats_on_metadata внутри структуры PHP PDO, которая использует транзакции и готовит операторы?
1 ответ
Удалить слово GLOBAL из заявления. Это, безусловно, не позволит установить переменную состояния GLOBAL для пользователя без прав root.