Php Mysql查询执行计划是否有缓存?

Php Mysql查询执行计划是否有缓存?,php,mysql,caching,sql-execution-plan,Php,Mysql,Caching,Sql Execution Plan,我到处寻找我的问题,但没有找到明确的答案。 数据库:MySQL 给定三个数字字段a、b、c和一个日期时间字段d,所有字段都单独索引 相关表格可容纳10 mil。记录 两个数字n,m 我有一个基本问题: select * where (a=n or b=n) and c IN(m) Order by d DESC (n可以是任意数,m可以是1-9之间的任意数) 我也有一个单独的索引,每一个。我在ac和bc上尝试了索引,但没有成功 在我的开发环境中,我总是会得到一个索引合并,这使得查询速度更快,尽

我到处寻找我的问题,但没有找到明确的答案。 数据库:MySQL 给定三个数字字段a、b、c和一个日期时间字段d,所有字段都单独索引 相关表格可容纳10 mil。记录

两个数字n,m

我有一个基本问题:

select * where (a=n or b=n) and c IN(m) Order by d DESC
(n可以是任意数,m可以是1-9之间的任意数) 我也有一个单独的索引,每一个。我在ac和bc上尝试了索引,但没有成功

在我的开发环境中,我总是会得到一个索引合并,这使得查询速度更快,尽管它会因为一些我并不真正关心的原因而进行文件排序

但在生产(不同的服务器、相同的模式/数据)上,无论我做什么,都不会发生这种情况

我解决这个奇怪问题的方法是将查询转换为以下语句:

发件人:

select * where (a=n or b=n) and c IN(m) ORDER BY d desc
致:

这也导致了生产环境上的合并索引查询 这基本上对我来说意味着某个地方有一个执行计划缓存,我一辈子都不知道在哪里清除该缓存(如果确实有)

我需要知道如何告诉生产环境在第一条语句中正确使用该索引

作为说明。。。出于某种原因,解释查询告诉我,在解释查询时,d是用于生产的索引

我需要知道如何告诉生产环境在第一条语句中正确使用该索引

使用“强制索引”语法

如果您在开发和生产中粘贴CREATE TABLE&EXPLAIN output for the tables&queries涉众(resp.)的表和查询,我们可以将其缩小到几个方面。也可能有助于了解每台机器上可用的RAM

附言:

在我的开发环境中,我总是会得到一个索引合并,这使得查询速度更快,尽管它会因为一些我并不真正关心的原因而进行文件排序


按不在索引中的d排序

“m可以是1-9之间的任何数字”——所以它是一个数字,而不是一个数字列表?如果是前者,那么为什么要使用IN?不知道MySQL,但其他DBMS使用统计信息来构建执行计划。如果您的系统没有相同的数据、相同的规格和相同的负载,您通常会得到不同的计划。@CBroe即使我将其更改为c=m,也会发生相同的情况。我还有其他查询,它们对m使用多个值,这就是我在中使用的原因。因此,无论是c=m还是c IN(m),都会出现相同的结果。那么,我建议您比较开发环境和生产环境之间的MySQL服务器设置。很容易,缓存、RAM等的不同设置会导致这些差异。注意:(2019年7月)MySQL没有执行计划缓存:
select * where (a=n or b=n) and c IN(m,'m') ORDER BY d desc