如何为具有组合主键的表创建索引?

时间:2012-02-22 16:23:38

标签: mysql indexing

我使用MYSQL创建一个带有组合主键的表。例如,col_a和col_b一起用作键。我将使用col_a和col_b经常获取一行,并且还将分别使用col_a或col_b来查询某些行。

我的问题是,我将如何为它创建索引?我是否只需要一个复合索引,或者三个索引,其中两个索引用于分隔列?

我认为MYSQL将为主键创建索引。但是它会为(col_a,col_b)创建一个复合索引,还是为每列创建一个索引?

2 个答案:

答案 0 :(得分:8)

多列索引

对于多列索引,索引从左到右工作。

鉴于您的主键:

(col_a, col_b)

以下是可以使用的情况:

  • col_a 。在col_a上搜索时可以使用索引,因为从左到右,col_a是第一列。
  • col_a& col_b 。在col_a和col_b上搜索时,也可以使用索引,因为从左到右,它是col_a,然后是col_b。
  • col_b:。仅搜索col_b时,无法使用索引,因为索引中的第一列是col_a,我们无法跳过列。

给出更大的索引:

(col_a, col_b, col_c)
  • col_a
  • col_a& col_b
  • col_a& col_b& col_c
  • col_a& col_c 。无法跳过索引中的col_b。
  • col_b:。不能跳过col_a。
  • col_c:。不能跳过col_a。
  • col_b& col_c 。无法跳过索引中的col_a。

涵盖索引

要将索引用作"covering" index,从左到右的模式仍然适用。

给定索引(col_a, col_b),您可以选择col_a和col_b,但只搜索col_a(或col_a和col_b),MySQL可以使用索引进行搜索和检索数据,因为col_a和col_b都在索引中。这样可以节省实际行数据的行程,因为这些值存储在索引中。

给定索引(col_a, col_b, col_c),如果仅搜索col_a并且能够使用覆盖索引返回col_c,则无法SELECT col_a和col_c,因为您无法跳过索引中的col_b。相反,MySQL会访问实际的表数据。但是,如果您同时搜索col_a和col_b,则可以选择col_a和col_c并将其用作覆盖索引。

“覆盖”索引中的主键

每个辅助索引都包含索引中的主键。

与覆盖索引相关的单列索引可以被认为是以下模式中的多列索引。给定主键(col_a, col_b),col_b上的单个列索引实际上看起来像(col_b)(col_a, col_b)

鉴于上面的单列索引,您仍然可以选择col_a和col_b,并搜索col_b,并且索引可以用作覆盖索引。由于主键包含col_a,因此MySQL仍然可以使用索引返回两列而无需点击实际的表数据。

如果我想搜索col_b怎么办?

给定主键(col_a, col_b),如果要仅搜索col_b,则应在col_b上添加单个列索引。如上所述,如果要返回col_b和col_a,它仍可用作覆盖索引。

答案 1 :(得分:3)

(col_a,col_b)上的复合主键索引将处理您在两列上查询或仅查询col_a的情况。对于仅针对col_b的查询,您需要一个单独的索引。