我使用MYSQL创建一个带有组合主键的表。例如,col_a和col_b一起用作键。我将使用col_a和col_b经常获取一行,并且还将分别使用col_a或col_b来查询某些行。
我的问题是,我将如何为它创建索引?我是否只需要一个复合索引,或者三个索引,其中两个索引用于分隔列?
我认为MYSQL将为主键创建索引。但是它会为(col_a,col_b)创建一个复合索引,还是为每列创建一个索引?
答案 0 :(得分:8)
多列索引
对于多列索引,索引从左到右工作。
鉴于您的主键:
(col_a, col_b)
以下是可以使用的情况:
给出更大的索引:
(col_a, col_b, col_c)
涵盖索引
要将索引用作"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的查询,您需要一个单独的索引。