并不是所有的存储引擎都支持所有的索引类型。
2.1.1
、
B-Tree
索引
假设有如下一个表:
CREATE TABLE People (
last_name varchar(50) not null,
first_name varchar(50) not null,
dob date not null,
gender enum('m', 'f') not null,
key(last_name, first_name, dob)
);
其索引包含表中每一行的
last_name
、
first_name
和
dob
列。其结构大致如下:
索引存储的值按索引列中的顺序排列。可以利用
B-Tree
索引进行全关键字、关键字范围和关键字前缀查
询,当然,如果想使用索引,你必须保证按索引的最左边前缀
(leftmost prefix of the index)
来进行查询。
(1)
匹配全值
(Match the full value)
:对索引中的所有列都指定具体的值。例如,上图中索引可以帮助你查找
出生于
1960-01-01
的
Cuba Allen
。
(2)
匹配最左前缀
(Match a leftmost prefix)
:你可以利用索引查找
last name
为
Allen
的人,仅仅使用索引中的
第
1
列。
(3)
匹配列前缀
(Match a column prefix)
:例如,你可以利用索引查找
last name
以
J
开始的人,这仅仅使用索
引中的第
1
列。
(4)
匹配值的范围查询
(Match a range of values)
:可以利用索引查找
last name
在
Allen
和
Barrymore
之间的人,
仅仅使用索引中第
1
列。
(5)
匹配部分精确而其它部分进行范围匹配
(Match one part exactly and match a range on another part)
:可以利
用索引查找
last name
为
Allen
,而
first name
以字母
K
开始的人。
(6)
仅对索引进行查询
(Index-only queries)
:如果查询的列都位于索引中,则不需要读取元组的值。
由于
B-
树中的节点都是顺序存储的,所以可以利用索引进行查找
(
找某些值
)
,也可以对查询结果进行
ORDER BY
。当然,使用
B-tree
索引有以下一些限制:
(1)
查询必须从索引的最左边的列开始。关于这点已经提了很多遍了。例如你不能利用索引查找在某一天
出生的人。
(2)
不能跳过某一索引列。例如,你不能利用索引查找
last name
为
Smith
且出生于某一天的人。
(3)
存储引擎不能使用索引中范围条件右边的列。例如,如果你的查询语句为
WHERE last_name="Smith"
AND first_name LIKE 'J%' AND dob='1976-12-23'
,则该查询只会使用索引中的前两列,因为
LIKE
是范围
查询。
评论