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


MySQL5.6 vs Percona 5.7 implicit conversion issue

我们最近开始测试从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(refhttp://php.net/manual/en/pdostatement.bindparam.php)对于每个变量!这样做会导致所有准备好的语句几乎全局重写,这些语句当前将参数数组传递给不支持显式类型设置的PDOState:execute()!

那么,我的问题是,mySQL中是否发生了变化,以至于5.7中没有进行隐式转换,或者是Percona还是tokuDB表?有没有可以设置的配置参数来重新打开?

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

如果TokuDB无处不在,一种可能性是由于糟糕的/旧的/NULL索引统计信息而导致索引选择不正确。5.7中还有许多SQL_MODE默认值更改,其中一些更改也可能影响行为。

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