【问题标题】:Creating 2 indexes for a join table为连接表创建 2 个索引
【发布时间】:2015-08-14 10:15:42
【问题描述】:

假设我在“贡献者”和“页面”之间有多对多的关系。我有一个包含 2 列的连接表:contributor_idpage_id。通过我的申请,我经常想要:

a) 对于给定的贡献者,找到它的页面 b) 对于给定的页面,找到它的贡献者

我知道创建一个(两个)多列索引可以在这里工作,但是索引应该按什么顺序排列?我是否应该创建 2 个多列索引,一个在 contributor_id 前面,另一个在 page_id 前面?

【问题讨论】:

  • 学习用您实际使用的软件标记问题。我只用“sql”替换了无关的数据库标签。
  • 这样做的成本和收益取决于您的 DBMS 及其版本。没有这些信息,这只是猜测。

标签: sql database-design indexing


【解决方案1】:

是的,在您的情况下创建两个索引是有意义的。

(contributor_id, page_id) 第一个,(page_id, contributor_id) 第二个。

此外,它们很可能都应该是唯一的。

【讨论】:

  • 索引合并怎么样?可能它具有相似的性能和很少的存储开销,而两个双字段索引“权重更大”。 dev.mysql.com/doc/refman/5.6/en/index-merge-optimization.html
  • @Kleskowy,我看不出查询处理器的索引合并功能在这里有什么帮助。例如,如果您在 (contributor_id, page_id) 上只有一个索引,并且想要搜索 SELECT contributor_id WHERE page_id=123,那么这个索引将毫无帮助。因此,如果查询SELECT contributor_id WHERE page_id=123SELECT page_id WHERE contributor_id=321 很常见,那么有两个索引是有意义的。
  • 这就是我的意思 - 两个 single-column 索引(较小)可能 index_merge VS 两个 double-column (较大)索引。这只是一个想法。
  • @Kleskowy,让我们看看SELECT contributor_id WHERE page_id=123。如果您在page_id 上有一个单列索引,它将有助于快速找到满足条件的行,但是对于每个找到的行,引擎必须查找不属于索引(contributor_id)。如果您在 contributor_id 上有第二个单列索引,它不会有助于消除这种查找。但是,如果(page_id, contributor_id)上有索引,那么引擎可以直接从索引中读取两列的值,这样效率更高。
猜你喜欢
  • 2021-02-23
  • 2015-08-11
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
  • 2017-11-05
  • 2021-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多