我们最近开始测试从 mySQL5.6 升级到 percona server 5.7 以及 tokuDB 表的使用。该数据库为我们的 PHP 5.5 应用程序提供服务,该应用程序使用 PDO 库进行参数化查询。
在将具有相同数据的 percona 加载到 tokudb 表中并将性能与现有生产进行比较后,我们立即注意到性能大幅下降(慢了 10 倍)。对于下面的查询,假设表有 1200 万行
我已经能够在 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 (参考http://php.net/manual/en/pdostatement.bindparam.php)为每个变量显式设置类型!这样做会导致几乎全局重写所有准备好的语句,这些语句当前将参数数组传递给不支持显式类型设置的 PDOStatement:execute()!
所以 - 我的问题是 - mySQL 中发生了一些变化,所以在 5.7 中没有进行隐式转换,或者是 Percona 还是 tokuDB 表?我可以设置一个配置参数来重新打开它吗?