1

我们最近开始测试从 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 表?我可以设置一个配置参数来重新打开它吗?

4

1 回答 1

0

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

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

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

于 2016-03-28T15:47:13.357 回答