【发布时间】:2010-02-22 10:52:31
【问题描述】:
我正在考虑在表上应用 3 个字段(类型、状态、用户 ID)的索引。我的大多数查询都有使用全部 3 个的 WHERE。但是,我有几个使用频率很高的查询,它们只使用 2 个字段(类型和状态)。
我的问题是,仅真正比较 2 个字段的查询会有效地使用创建包含所有 3 个字段的索引吗?还是有 2 个索引,一个有 3 个字段,一个有 2 个索引会更好?
【问题讨论】:
我正在考虑在表上应用 3 个字段(类型、状态、用户 ID)的索引。我的大多数查询都有使用全部 3 个的 WHERE。但是,我有几个使用频率很高的查询,它们只使用 2 个字段(类型和状态)。
我的问题是,仅真正比较 2 个字段的查询会有效地使用创建包含所有 3 个字段的索引吗?还是有 2 个索引,一个有 3 个字段,一个有 2 个索引会更好?
【问题讨论】:
我比 MySQL 更了解 Oracle,但我想在这种情况下是一样的。索引通常是B-Tree,这意味着如果索引是(type, status, user_id),数据库通常仍然可以使用它来搜索(type, status),因为它是组合索引的第一部分。但如果你使用(status, user_id),情况就不是这样了,除非有像 Oracle 的 INDEX_SKIP_SCAN 这样的东西。
第二个索引只覆盖两个字段可能会稍微快一些,具体速度取决于数据。但是如果你有两个索引,那么插入数据会比较慢,因为它们都需要维护。它还需要更多的磁盘空间。所以这是一个性能空间的权衡,只有你可以决定。
【讨论】:
是的,您可以按照 ewernli 提到的方式在 MySQL 中部分使用索引。
【讨论】:
看起来像一个 BTREE 索引,已排序(按顺序:类型、状态、用户 ID),在这种情况下,一个索引可以在两个查询中使用:只使用 2 个字段(类型和状态)
如果你只查询 user_id,这个索引帮不了你。
【讨论】: