【问题标题】:Will an index with 3 fields work for 2 field queries?具有 3 个字段的索引是否适用于 2 个字段查询?
【发布时间】:2010-02-22 10:52:31
【问题描述】:

我正在考虑在表上应用 3 个字段(类型、状态、用户 ID)的索引。我的大多数查询都有使用全部 3 个的 WHERE。但是,我有几个使用频率很高的查询,它们只使用 2 个字段(类型和状态)。

我的问题是,仅真正比较 2 个字段的查询会有效地使用创建包含所有 3 个字段的索引吗?还是有 2 个索引,一个有 3 个字段,一个有 2 个索引会更好?

【问题讨论】:

    标签: mysql indexing


    【解决方案1】:

    我比 MySQL 更了解 Oracle,但我想在这种情况下是一样的。索引通常是B-Tree,这意味着如果索引是(type, status, user_id),数据库通常仍然可以使用它来搜索(type, status),因为它是组合索引的第一部分。但如果你使用(status, user_id),情况就不是这样了,除非有像 Oracle 的 INDEX_SKIP_SCAN 这样的东西。

    第二个索引只覆盖两个字段可能会稍微快一些,具体速度取决于数据。但是如果你有两个索引,那么插入数据会比较慢,因为它们都需要维护。它还需要更多的磁盘空间。所以这是一个性能空间的权衡,只有你可以决定。

    【讨论】:

      【解决方案2】:

      是的,您可以按照 ewernli 提到的方式在 MySQL 中部分使用索引。

      【讨论】:

        【解决方案3】:

        看起来像一个 BTREE 索引,已排序(按顺序:类型、状态、用户 ID),在这种情况下,一个索引可以在两个查询中使用:只使用 2 个字段(类型和状态)

        如果你只查询 user_id,这个索引帮不了你。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-06-14
          • 2012-08-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-11
          • 2013-01-12
          相关资源
          最近更新 更多