MySQL5.6 против Percona 5.7 проблема неявного преобразования
Недавно мы начали тестировать обновление с MySQL5.6 до Percona Server 5.7 и использование таблиц tokuDB. База данных обслуживает наше приложение PHP 5.5, которое использует библиотеку PDO для параметризованных запросов.
Загрузив percona с идентичными данными в таблицу tokudb и сравнив производительность с существующим производством, мы сразу заметили огромное снижение производительности (в 10 раз медленнее). Для запросов ниже предположим, что таблица имеет 12 миллионов строк
Я смог сузить эту проблему в базе данных 5.7 до того факта, что при выполнении запроса, такого как:
SELECT * FROM TABLE WHERE id='12345'; -- exec time 10.5sec
vs.
SELECT * FROM TABLE WHERE id=12345; -- exec time 1.3sec
где id имеет тип столбца целое число. Это было мое впечатление, и мое исследование, кажется, подтверждает, что mySQL должен выполнять неявное преобразование "12345" в 12345, когда сравниваемый столбец является числовым типом, однако в mySQL5.7/Percona этого не происходит. Это происходило в MySQL5.6x
Проблема здесь в том, что при таком поведении вам нужно было бы явно установить тип, используя PDOStatement:: bindParam (ref http://php.net/manual/en/pdostatement.bindparam.php) для каждой переменной! Это может привести к почти глобальному переписыванию всех подготовленных операторов, которые в настоящее время передают массивы параметров в PDOStatement:execute(), которая не поддерживает явную установку типа!
Итак, мой вопрос заключается в том, изменилось ли что-то в mySQL, поэтому неявное преобразование не выполняется в 5.7, или это Percona или таблица tokuDB? Есть ли параметр конфигурации, который я могу установить, чтобы включить его снова?
1 ответ
Неясно, пытаетесь ли вы обновить 5.6 TokuDB и сравнить ее с 5.7 TokuDB или 5.6 InnoDB с 5.7 TokuDB. Не могли бы вы уточнить и определить конкретные варианты и версии 5.6 и 5.7?
Если TokuDB вокруг, одна возможность - неправильный выбор индекса из-за плохой / старой / нулевой статистики индекса. В 5.7 также есть множество изменений по умолчанию SQL_MODE, некоторые из которых также могут влиять на поведение.
Также может быть полезно увидеть результаты 'SHOW CREATE TABLE' и 'SHOW INDEXES FROM' в экземплярах 5.6 и 5.7.