调试MySQL查询会永久影响执行时间

调试MySQL查询会永久影响执行时间,mysql,sql,Mysql,Sql,我正在尝试调试一个简单但运行速度非常慢的MySQL查询,该查询是在一个非常大的表(13m行)上运行的,该表有多个索引 连接非常基本,只是从小表上的ID到大表上的foreign_ID的连接 该查询在过去运行得很快,但此后添加了大量新数据。以前运行需要30分钟,现在需要5分钟 在live上,我尝试通过使用alter命令将其设置为InnoDb来修复这个大表。但这没什么区别 因此,为了调试查询,我运行EXPLAIN并尝试删除连接等,直到查询再次快速运行 连接类型开始时为ALL、eq\u ref、ref和

我正在尝试调试一个简单但运行速度非常慢的MySQL查询,该查询是在一个非常大的表(13m行)上运行的,该表有多个索引

连接非常基本,只是从小表上的ID到大表上的foreign_ID的连接

该查询在过去运行得很快,但此后添加了大量新数据。以前运行需要30分钟,现在需要5分钟

在live上,我尝试通过使用alter命令将其设置为InnoDb来修复这个大表。但这没什么区别

因此,为了调试查询,我运行EXPLAIN并尝试删除连接等,直到查询再次快速运行

连接类型开始时为ALL、eq\u ref、ref和ref.

然后,当我重新启用联接并试图找到一种使其以性能方式工作的方法时,我发现实际上现在,原始查询又能快速工作了

唯一改变的是查询执行计划

连接类型现在是range、eq\u ref、eq\u ref和ref.

发生了什么事?为什么MySQL现在对待同一个查询的方式与以前不同

我如何让我的live server也这样做?我怎样才能阻止这种情况再次发生


编辑:prod和Local上的MySQL版本是5.7

您似乎遇到了一个查询计划程序错误,该错误经常出现在MySQL 5.7和更高版本上。发生的情况是,查询计划器将决定错误的执行计划(索引、联接顺序),这导致同一数据集上的同一查询有时运行得很快(使用正确的执行计划),有时运行得很慢(使用错误的执行计划,通常会导致全表扫描)。我在我工作过的每一个MySQL 5.7和8.0部署中都看到过这种情况。在MySQL 5.6及更早版本和MariaDB上,只有在表(10+)上有异常多的索引时,查询计划器的这种行为才是可证明的。因此,如果在涉及的一个表上有很多索引,那么应该尝试合理地减少索引的数量

除了将每个表上的索引数保持在尽可能低的水平之外,您还有两个选项来解决这个问题:

1) 当您确定遇到此错误的查询时,请使用索引提示(使用/FORCE index(index_name))约束它们,如果需要,还可以使用stright_JOIN强制执行连接顺序


2) 切换到MariaDB,它似乎没有遇到这个问题。

您似乎遇到了一个查询计划程序错误,该错误经常出现在MySQL 5.7及更高版本上。发生的情况是,查询计划器将决定错误的执行计划(索引、联接顺序),这导致同一数据集上的同一查询有时运行得很快(使用正确的执行计划),有时运行得很慢(使用错误的执行计划,通常会导致全表扫描)。我在我工作过的每一个MySQL 5.7和8.0部署中都看到过这种情况。在MySQL 5.6及更早版本和MariaDB上,只有在表(10+)上有异常多的索引时,查询计划器的这种行为才是可证明的。因此,如果在涉及的一个表上有很多索引,那么应该尝试合理地减少索引的数量

除了将每个表上的索引数保持在尽可能低的水平之外,您还有两个选项来解决这个问题:

1) 当您确定遇到此错误的查询时,请使用索引提示(使用/FORCE index(index_name))约束它们,如果需要,还可以使用stright_JOIN强制执行连接顺序


2) 切换到MariaDB,它似乎没有遇到这个问题。

当有不同的执行计划时,查询是不同的。它运行的是一个确定的过程,我们可以设置密钥来测试不同的索引。你们的mysql版本是什么?mysql在服务器和服务器上是5.7locally@nbk对不起,我不知道你的意思。我面临的问题是同一个查询在不同的服务器上有不同的执行计划。事实上,执行计划在我的本地机器上也发生了变化。@JonWinstanley:一切都一样吗?数据和查询?请检查工作方式当有不同的执行计划时,查询是不同的。它运行的是一个确定的过程,我们可以设置密钥来测试不同的索引。你们的mysql版本是什么?mysql在服务器和服务器上是5.7locally@nbk对不起,我不知道你的意思。我面临的问题是同一个查询在不同的服务器上有不同的执行计划。事实上,执行计划在我的本地机器上也发生了变化。@JonWinstanley:一切都一样吗?数据和查询?请检查工作情况,非常感谢!非常有用的信息。听起来也很有可能,因为这只发生在我们升级到5.7之后。我们将进一步调查。非常感谢!非常有用的信息。听起来也很有可能,因为这只发生在我们升级到5.7之后。我们将进一步调查此事。