【发布时间】:2015-09-20 19:47:30
【问题描述】:
我到处寻找我的问题,但没有找到明确的答案。 数据库: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
这也导致了生产环境中的合并索引查询 这对我来说基本上意味着某处有一个执行计划缓存,我一生都无法弄清楚在哪里清除该缓存(如果确实有的话)
我需要知道如何告诉生产环境在第一条语句中正确使用该索引。
作为注释...由于某种原因,解释查询告诉我 d 是解释查询时在生产中使用的索引。
【问题讨论】:
-
“m 可以是 1-9 之间的任何数字”——所以它是一个数字,而不是一个数字列表?如果是前者——那你为什么要使用 IN?
-
不知道 MySQL 但其他 DBMS 使用统计信息来构建执行计划。如果您的系统没有相同的数据、相同的规格和相同的负载,您通常会得到不同的计划。
-
@CBroe 即使我将其更改为 c=m,也会发生同样的事情。我还有其他使用 m 多个值的查询,这就是我使用 IN 的原因。所以无论是 c=m 还是 c IN(m) 都会发生相同的结果。
-
那么我建议您比较一下您的开发和生产环境之间的 MySQL 服务器设置。缓存、RAM 等的不同设置很可能会导致您看到的差异。
-
注:(2019 年 7 月)MySQL 没有执行计划缓存:bugs.mysql.com/bug.php?id=42808
标签: php mysql caching sql-execution-plan