【问题标题】:finding the optimal order of multi-column index找到多列索引的最佳顺序
【发布时间】:2013-10-17 21:59:25
【问题描述】:

假设我有一个包含两个索引的表 - 一个在 a 列上,一个在 a、b 和 c 列上。

我注意到,根据索引定义中列的顺序,即使引用了多列索引中的所有三列,MySQL 也可能最终使用单列索引而不是多列索引在 JOIN 的 ON 部分。

这就引出了一个问题……如何确定列的理想顺序?你只需要蛮力吗?

【问题讨论】:

  • 你能展示一个发生这种情况的示例查询吗?只有在索引中使用列的子集时,排序才有意义:列必须是索引的前缀。
  • 没那么容易。这是我的雇主数据库,我不想将架构发布到非公共数据库,更不用说提供可以进行查询的数据了。我试图在 sqlfiddle.com 上制作沙盒示例(其正常运行时间最近参差不齐)但没有成功:(
  • .. 这有点引出问题 - 为什么要在论坛上发布一个模糊的问题?
  • 什么构成模糊?如果我说“是否有可能找到包含特定代码 sn-p 的所有文件?我正在使用 linux”,一个正确的答案是 grep -r whatever .。我想在那个问题中,人们可以看到这样一个事实,即他们没有说他们正在使用哪个编辑器或 IDE,因为这使问题变得模糊,但这并不意味着没有明确的答案。
  • @neubert - 没有架构,没有可处理的查询。猜测这使其含糊不清,因此无法提供建议

标签: mysql sql indexing


【解决方案1】:

索引中列的顺序不是无关的。有一种方法。

  • 首先,在相等项中涉及的一个或多个列与 AND 结合。

    WHERE a = 1 AND b = 2
    
  • 其次,范围项中涉及的单个列。要么是那个,要么是一个或多个涉及排序的列。

    WHERE a = 1 AND b = 2 AND c > 3
    

    WHERE a = 1 AND b = 2
    ORDER BY c, d
    
  • 第三,选择列表中引用但未被搜索或排序引用的列。

    SELECT x, y, z
    . . .
    WHERE a = 1 AND b = 2 AND c > 3
    

这将导致(a, b, c, x, y, z) 上的索引。

我在我的演示文稿How to Design Indexes, Really 中对此进行了更详细的解释。

【讨论】:

  • 有趣的方法比尔。很有意义。基本上在您正在模拟的索引中包含 x,y,z 列,包括在 MS SQL Server 2005+ 索引中找到的列。我从来没有想到过。实际上绝对精彩。这个正在进入我的花招。
  • @Namphibian,是的,它有时被称为覆盖索引,如果索引在缓冲区中,那么它是一个巨大的性能优势。
  • 是的。无需从表中读取值,只需直接从索引中读取即可。确实很酷。只是从来没有这样想过。
【解决方案2】:

MySQL 使用索引的方式和时间取决于表上的统计信息。使用统计数据,它可能会决定其中一个。您可以强制它使用特定索引,但这通常不是一个好主意。有关详细信息,请参阅this 链接。

随着表的增长和统计数据的变化,这是要记住的事情。因此,查询可能今天使用一个索引运行另一个明天。 MySQL 将确定使用哪个更好。这就是为什么强制索引在某些时候只会让自己陷入困境。

无法创建永远完美的索引,因此您需要做的是创建一个索引,以帮助在查询变慢时加快查询速度。所以打开慢日志并监控它。当查询开始运行缓慢时,请执行 EXPLAIN,然后找出如何优化。哦,有时您可能不得不删除索引,因为它们可能不再被使用。

询问您是否需要更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-22
    • 2011-05-14
    • 1970-01-01
    • 2022-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    相关资源
    最近更新 更多