MySQL5.6 vs Percona 5.7隐式转换问题

时间:2016-03-27 18:13:33

标签: php mysql pdo percona tokudb

我们最近开始测试从mySQL5.6到percona服务器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是列类型integer。这是我的印象,我的研究似乎证实了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 个答案:

答案 0 :(得分:0)

目前尚不清楚您是否尝试将5.6 TokuDB性能升级并比较5.7 TokuDB性能或5.6 InnoDB升级到5.7 TokuDB,您能否澄清并确定具体的5.6和5.7变体和版本?

如果TokuDB到处都是,由于bad / old / NULL索引统计信息,一种可能是索引选择不正确。 5.7中还有许多SQL_MODE默认值更改,其中一些也可能会影响行为。

在5.6和5.7实例上查看“SHOW CREATE TABLE”和“SHOW INDEXES FROM”的结果可能也很有用。