MySQL可以创建复合索引(即多列上的索引)。索引最多可由16列组成。对于某些数据类型,您可以为列的前缀建立索引。
MySQL可以将多列索引用于测试索引中所有列的查询,也可以用于仅测试第一列、前两列、前三列等的查询。如果在索引定义中按正确的顺序指定列,则单个复合索引可以加速同一表上的多种查询。
多列索引可以被视为一个排序数组,其行包含通过连接索引列的值而创建的值。
作为复合索引的替代方案,您可以引入一个基于其他列的信息“哈希”的列。如果此列很短,具有合理的唯一性,并且有索引,那么它可能比许多列上的“宽”索引更快。在MySQL中,很容易使用这个额外的列:
假设一个表具有以下规格:
名称索引是last_name和first_name列上的索引。该索引可用于查询中的查找,这些查询指定了last_name和first_name值组合的已知范围内的值。它也可以用于仅指定last_name值的查询,因为该列是索引的最左侧前缀(如本节稍后所述)。因此,名称索引用于以下查询中的查找:
但是,名称索引不用于以下查询中的查找:
假设您发出以下SELECT语句:
834/10000
实时翻译
划译
如果col1和col2上存在多列索引,则可以直接获取相应的行。如果col1和col2上存在单独的单列索引,优化器会尝试使用索引合并优化(见第8.2.1.3节“索引合并优化”),或者尝试通过决定哪个索引排除更多行并使用该索引来获取行,从而找到限制性最强的索引。
如果表具有多列索引,则优化器可以使用索引的任何最左侧前缀来查找行。例如,如果你在(col1,col2,col3)上有一个三列索引,那么你在(coll1)、(col1、col2)和(col1)、col2、col3上都有索引搜索功能。
如果列不构成索引的最左侧前缀,MySQL就无法使用索引执行查找。假设您有如下所示的SELECT语句:
如果(col1,col2,col3)上存在索引,则只有前两个查询使用该索引。第三和第四个查询确实涉及索引列,但不使用索引来执行查找,因为(col2)和(col2,col3)不是(col1,col2,col3)的最左侧前缀。