我们正处于从MySql 5.7迁移到8的中期。我们有两个开发系统,而且大多数东西似乎都运行得很好。我们发现问题的一个地方是,我们有一个查询,该查询在我们的生产服务器上需要<2秒,但在我们的两个转换系统上,不需要超过50秒。
我们在计划中注意到的一件不同的事情是,在我们的生产系统中,步骤的select_type
是:
id | select_type |
---|---|
1 | 主要 |
2 | 依赖子查询 |
3 | 子查询 |
3 | 子查询 |
3 | 子查询 |
3 | 子查询 |
哎哟。双重阴性。让我的大脑受伤。
这些索引可能会有所帮助:
e: INDEX(ent_id, status_id)
uam: INDEX(user_id, account)
eam: INDEX(event_id, account, acct)
添加复合索引后,使用相同的前导列进行DROP索引。也就是说,当您同时拥有INDEX(a(和INDEX(a,b(时,抛出前者。
请向我们展示整个EXPLAIN SELECT ...
您是否可以通过启用或禁用其中一个优化器来共享您正在使用的两个版本的优化器列表的输出,这可能是不同查询计划的原因。
选择@@optimizer_switch;
这就像在黑暗中拍摄,在这里分享信息。
a( 尽管如此,您还是尝试过强制索引来强制优化器选择5.7中性能更好的索引。b( 数据集的基数在5.7和8.0环境之间匹配吗c( 您可以尝试操作索引统计信息,从而迫使优化器选择不同的索引,而不是默认索引。d( 执行explain format=json这将为您提供更多关于查询成本以及查询执行过程中到底发生了什么的理由。