MySQL查询执行计划是否具有缓存功能?

3

我已经在各处寻找解决方案,但没有找到确定的答案。 数据库:MySQL 给定三个数字字段a、b、c和一个日期时间字段d,都单独索引 参与的表中有1000万条记录。

两个数字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

致:

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

这导致了生产环境上的合并索引查询,对我来说基本意味着某处有一个执行计划缓存,但我无论如何都找不到清除该缓存的方法(如果确实存在的话)。

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

需要注意的是...由于某种原因,Explain查询告诉我,在解释查询时在生产环境中使用了d索引。


“m可以是1到9之间的任何数字”- 所以是单个数字,而不是数字列表?如果是前者-那么你为什么使用IN? - CBroe
对于MySQL我不了解,但其他DBMS使用统计数据来构建执行计划。如果您的系统没有相同的数据、相同的规格和相同的负载,那么通常会得到不同的计划。 - Álvaro González
@CBroe 即使我将其更改为 c=m,仍会发生相同的情况。我还有其他查询需要使用多个值来代替 m,这就是为什么我使用 IN 的原因。因此,无论是 c=m 还是 c IN(m),结果都是相同的。 - Zack Ciprian
那么我建议您比较开发环境和生产环境之间的MySQL服务器设置。很可能不同的缓存、RAM等设置导致您看到的差异。 - CBroe
注意:(截至2019年7月)MySQL没有执行计划缓存:https://bugs.mysql.com/bug.php?id=42808 - Henk Poley
1个回答

1
我需要知道如何告诉生产环境在第一条语句中正确使用该索引。可以使用“force index”语法。如果您将涉及表和查询的CREATE TABLE和EXPLAIN输出(分别在dev和production上)粘贴到此处,我们可以将其缩小到仅有几个问题。还需要知道每台机器可用的RAM情况。 PS:在我的开发环境中,我总是得到一个索引合并,这使查询变得快速,尽管由于某种原因它会进行文件排序,但我并不真正关心。按未包含在索引中的d进行排序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接