MySQL可以创建复合索引(即多个列上的索引)。一个索引最多可以包含16个列。对于某些数据类型,可以为列的前缀建立索引(参见第8.3.5节“列索引”)。
MySQL可以使用多列索引来测试测试索引中的所有列的查询,或者在第一个列中测试的查询,前两个列,前三列等的查询。如果在索引定义中以正确的顺序指定列,则单个复合索引可以加快同一表上的几种查询。
多列索引可以被视为一个排序阵列,其中一行包含通过连接索引列的值来创建的值。
作为复合索引的替代方法,您可以引入一个列”哈希”基于来自其他列的信息。如果此列短,合理独特,并且索引,它可能比a更快”宽”在许多列上建立索引。在MySQL中,很容易使用这个额外的列:
SELECT * FROMtbl_name.在哪里hash_col= MD5 (CONCAT (Val1.,val2.)),col1=Val1.和col2=val2.;
假设一个表有以下规范:
创建表测试(ID int not null,last_name char(30)not null,first_name char(30)not null,主键(ID),索引名称(last_name,first_name));
的的名字
索引是对的索引姓
和first_name
列。索引可用于在查询中进行查找,该查询在已知范围内为组合指定值姓
和first_name
值。它还可以用于仅指定姓
值,因为该列是索引最左边的前缀(如本节稍后所述)。因此,的名字
索引用于以下查询中的查询:
SELECT * FROM test WHERE last_name='Jones';SELECT * FROM test WHERE last_name='Jones' AND first_name='John';SELECT * FROM test WHERE last_name='Jones' AND first_name='John' OR first_name='Jon';SELECT * FROM test WHERE last_name='Jones' AND first_name >='M' AND first_name < 'N';
然而,的名字
索引是不用于以下查询中的查找:
SELECT * FROM test WHERE first_name='John';SELECT * FROM test WHERE last_name='Jones' OR first_name='John';
假设您发布了以下内容选择
陈述:
SELECT * FROMtbl_name.col1 =Val1.和col2 =val2.;
如果存在多列索引col1
和col2
,可以直接获取相应的行。上存在单独的单列索引col1
和col2
,优化器尝试使用索引合并优化(参见第8.2.1.3节,“索引合并优化”)或者尝试通过决定哪个索引排除更多行并使用该索引来查找最严格的索引来获取行。
如果表具有多列索引,则优化程序可以使用索引的任何最偏好的前缀以查找行。例如,如果您有三列索引(col1,col2,col3)
,您有索引的搜索功能(col1)
,(col1,col2)
, 和(col1,col2,col3)
.
如果列没有在索引的最左边形成前缀,MySQL就不能使用索引来执行查找。假设你有选择
此处显示的陈述:
SELECT * FROMtbl_name.col1 =Val1.;SELECT * FROMtbl_name.col1 =Val1.和col2 =val2.;SELECT * FROMtbl_name.col2 =val2.;SELECT * FROMtbl_name.col2 =val2.和col3 =Val3.;
如果索引在(col1,col2,col3)
,只有前两个查询使用索引。第三和第四个查询确实涉及索引列,但不使用索引来执行查找,因为(col2)
和(col3 col2)
最左边的前缀不是(col1,col2,col3)
.