8.3.5 Multiple-Column Indexes 多列索引
MySQL 可以创建符合索引(索引在多列上),一个索引可以包含多大16个列,对于某些数据类型,你可以索引一个前缀列。
MySQL 可以使用多列索引用于查询,测试所有的列在索引里,或者 查询只测试第一列,头2列,头3列。
如果你指定 了正确的顺序在索引定义的时候,一个简单的符合索引能加速若干查询。
一个多列索引 被认为是一个已排序的数组, 索引中包含值的行
注意:
作为一个复合索引,你可以介绍基于其他列的被hash的列。如果这个列是短的,合理的唯一的,可以被索引的,
可能比宽的在很多列上的索引更快。 在Mysql, 这是很容易使用这个额外的列:
SELECT * FROM tbl_name
WHERE hash_col=MD5(CONCAT(val1,val2))
AND col1=val1 AND col2=val2;
假设一个表有下面的规则:
CREATE TABLE test (
id INT NOT NULL,
last_name CHAR(30) NOT NULL,
first_name CHAR(30) NOT NULL,
PRIMARY KEY (id),
INDEX name (last_name,first_name)
);
name 索引是在last_name和first_name 列,该指标可用于查找查询指定值在已知范围内组合last_name和first_name值。
它也可以用于特定的last_name值的查询,因为last_name列是索引最左边前缀。
因此, name index 适用于下面的查询:
SELECT * FROM test WHERE last_name=’Widenius’;
SELECT * FROM test
WHERE last_name=’Widenius’ AND first_name=’Michael’;
SELECT * FROM test
WHERE last_name=’Widenius’
AND (first_name=’Michael’ OR first_name=’Monty’);
SELECT * FROM test
WHERE last_name=’Widenius’
AND first_name >=’M’ AND first_name < ‘N’;
name index 不能用于下面的查询:
SELECT * FROM test WHERE first_name=’Michael’;
SELECT * FROM test
WHERE last_name=’Widenius’ OR first_name=’Michael’;
假设 你执行下面的SELECT 语句:
SELECT * FROM tbl_name
WHERE col1=val1 AND col2=val2;
如果一个多列索引存在col1和col2上, 相应的记录可以直接取得。 如果一个单独的 单列索引在col1和col2,
优化器尝试使用index merge 优化,或者尝试找到最限定的索引通过确定哪个索引排除最多的行。
如果表中有多个列的索引,索引的最左前缀能用于通过优化器来查找记录。比如,
如果你有一个3列索引在(col1, col2, col3), 你可以通过索引搜索在 (col1), (col1, col2), and (col1, col2, col3).
MySQL 无法使用索引来执行查找 ,如果列不构成索引的最左前缀进行查找,假定您有此处显示的选择语句:
SELECT * FROM tbl_name WHERE col1=val1;
SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;
SELECT * FROM tbl_name WHERE col2=val2;
SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3;
如果一个index 存在于(col1, col2, col3), 只有前2个能使用索引, 第三个和第四个查询
确实涉及了索引列,但是t (col2) and (col2, col3) 不是索引的最左边列。