【问题标题】:Mysql query execution plan has caching?Mysql查询执行计划有缓存吗?
【发布时间】: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


【解决方案1】:

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

使用“强制索引”语法。

如果您将 CREATE TABLE & EXPLAIN 输出粘贴到开发和生产中涉及的表和查询(分别),我们可以将其缩小到几件事。也可能有助于了解每台机器上可用的 RAM。

ps:

在我的开发环境中,我总是得到一个索引合并,这使得查询速度更快,即使它出于某种我并不真正关心的原因进行了文件排序。

按不在索引中的 d 排序

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 2012-06-19
    • 2022-01-26
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多