如果 SQL 语句想使用某一个索引,则 SQL 语句的查询项和 WHERE 子句的过滤项中必须包含该索引的全部索引键。当同时包含了多个索引的索引键时,系统会选择一个最优的索引进行查询。例如:SQL 语句“SELECT A FROM T WHERE B=1; ”会使用建立在(A,B)列上的索引。
总体来说,最少的查找即可得到所需数据,即为最优索引。
下面用具体的示例进行介绍。
数据准备:
CREATE TABLE T2 (ID int,NAME varchar(20),DEPARTMENT varchar(20),SALARY INT);
CREATE CLUSTER INDEX S21 on T2(ID); //聚集索引
CREATE INDEX S22 on T2(NAME,DEPARTMENT);
CREATE INDEX S23 on T2(NAME);
CREATE INDEX S24 on T2(DEPARTMENT);
CREATE INDEX S25 on T2(SALARY);
例 1 使用聚集索引 S21
EXPLAIN SELECT SALARY FROM T2 WHERE ID=10;
1 #NSET2: [1, 1, 8]
2 #PRJT2: [1, 1, 8]; exp_num(1), is_atom(FALSE)
3 #CSEK2: [1, 1, 8]; scan_type(ASC), S21(T2), scan_range[10,10]
例 2 使用非聚集索引 S22
查询语句想使用索引 S22,则 SELECT 查询项和 WHERE 子句过滤项需包含 S22 的全部索引键 NAME 和 DEPARTMENT。
EXPLAIN SELECT DEPARTMENT FROM T2 WHERE NAME LIKE'%Zhang' AND DEPARTMENT='A部门';
1 #NSET2: [1, 1, 96]
2 #PRJT2: [1, 1, 96]; exp_num(1), is_atom(FALSE)
3 #SLCT2: [1, 1, 96]; (T2.DEPARTMENT = 'A部门' AND T2.NAME LIKE '%Zhang')
4 #SSCN: [1, 1, 96]; S22(T2)
或
EXPLAIN SELECT DEPARTMENT FROM T2 WHERE NAME='Zhang San';
1 #NSET2: [1, 1, 96]
2 #PRJT2: [1, 1, 96]; exp_num(1), is_atom(FALSE)
3 #SSEK2: [1, 1, 96]; scan_type(ASC), S22(T2), scan_range[('Zhang San',min),('Zhang San',max))
例 3 先使用非聚集索引 S23,再使用聚集索引
首先,在 SSEK 中使用 S23 非聚集索引进行扫描定位,得到 NAME;
其次,因为 SELECT * 中查询项太多,需要在 BLKUP2 中通过 S23 回到聚集索引上进行二次查找,得到*中的其它数据。
EXPLAIN SELECT * FROM T2 WHERE NAME='Zhang San';
1 #NSET2: [1, 1, 116]
2 #PRJT2: [1, 1, 116]; exp_num(5), is_atom(FALSE)
3 #BLKUP2: [1, 1, 116]; S23(T2)
4 #SSEK2: [1, 1, 116]; scan_type(ASC), S23(T2), scan_range['Zhang San','Zhang San']
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




