我们一直在亚马逊的Aurora上使用MySQL 5.6,但由于寿命的结束,我们现在不得不升级到更高的版本。
我们注意到MySQL 5.7和8的表现不如5.6。对于某些数据,查询优化器没有选择最佳的查询计划(即。选择表扫描而不是索引扫描,或者不选择与5.6相同的计划)。即使优化器选择了与5.6相同的查询计划,查询也有点慢。
在寻找解决方案的过程中,我们能够通过关闭在较高版本的MySQL中引入的新标志来实现与optimizer_switch 5.6类似的性能,从而使标志与5.6中的标志对齐。
5.7
--optimizer-switch=duplicateweedout=off,condition_fanout_filter=off,derived_merge=off
为8
--optimizer-switch=duplicateweedout=off,condition_fanout_filter=off,derived_merge=off,use_invisible_indexes=off,skip_scan=off,hash_join=off,subquery_to_derived=off,prefer_ordering_index=off,hypergraph_optimizer=off,derived_condition_pushdown=off
用这种方式对齐优化标志是否使mysql 5.7/8的行为与MySQL5.6相同?还有,这是推荐的吗?
发布于 2022-03-11 14:59:41
过去,我曾建议这样做,由5.6至5.7不等。
在我在Dec 16, 2017
Mysql之后_升级到5.7,优化器不对大型IN子句使用索引上的旧文章中,我建议获取旧值5.6,并在5.7中使用它们。在这个问题的任择议定书中,它起了作用。。这并不是说它在每一种情况下都会起作用,但选择总是存在的。
最好的做法是调整各个优化器开关选项。例如,回到Dec 28, 2015
,我向如何尽快更新million+单表中的10行MySQL行?发布了答案,其中我推荐了一些内容,从MySQL文档到启用批处理密钥访问来提高连接性能。
虽然这是一个可行的选择,以改变所有开关回到5.6设置,但它不是一刀切的。有些查询可能对MySQL 5.7开箱即用更好,而另一些查询则不然.MySQL 8.0也是如此。
您知道Aurora2.x和3.x的最新版本将某些实例类的innodb_read_io_threads降低到1吗?转到MySQL并运行
mysql> select @@global.innodb_read_io_threads;
如果上面写着1,你就发现了问题。
AFAIK,亚马逊没有记录这一点,但我看到其他人被它咬了。如果您想验证这一点,可以联系AWS支持。
还请注意,不能在Aurora的DB参数组中使用innodb_read_io_threads。
不幸的是,我只能推荐以下两种选择
选项1:切换到RDS并增加您的IOP。您始终可以在DB参数组中为RDS更改innodb_read_io_threads。需要工作和$$$$。
选项2:升级到更大的实例类。高级实例类具有更多的innodb_read_io_threads。示例: db.r5.24xl将有16个innodb_read_io_threads。需要$$$$$$$$$$$。工作量也必须成为扩大规模的合理理由。
这两种选择似乎都不是愉快的,也不是可取的。对不起!
https://dba.stackexchange.com/questions/308617
复制相似问题