8.3.5 Multiple-Column Indexes 多列索引

来源:互联网 发布:传奇3物品数据库 编辑:程序博客网 时间:2024/06/03 08:40

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) 不是索引的最左边列。

0 0
原创粉丝点击