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

fly*_*pen 6 mysql indexing

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

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

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

Mar*_*ams 8

多列索引

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

鉴于您的主键:

(col_a, col_b)
Run Code Online (Sandbox Code Playgroud)

以下是可以使用的情况:

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

给定一个更大的索引:

(col_a, col_b, col_c)
Run Code Online (Sandbox Code Playgroud)
  • col_a:是的
  • col_a&col_b:是的
  • col_a&col_b&col_c:是的
  • col_a&col_c:没有.无法跳过索引中的col_b.
  • col_b :: NO.不能跳过col_a.
  • col_c :: NO.不能跳过col_a.
  • col_b&col_c:没有.无法跳过索引中的col_a.

覆盖索引

要将索引用作"覆盖"索引,从左到右的模式仍然适用.

给定索引(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,则可以选择SELECT 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,它仍可用作覆盖索引.