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