在实际工作中,为了提高表查询的效率,我们会在表上创建各种索引。但是,有时候我们虽然创建了组合索引,查询效率并没有提高,这是为什么呢?本文将带大家一探究竟。
实验背景:
DM Database Server x64V7.1.6.46-Build(2018.02.08-89107)ENT
表结构如下:
create table TEST(id int primary key,
student_name varchar(20),math int,english int,science int)
并录入 10000 条测试数据。
create index "index_test" on "SYSDBA"."TEST"("MATH" ASC,"ENGLISH" ASC,"SCIENCE" ASC) STORAGE(ON "MAIN");
这个组合索引中,列的顺序为 MATH,ENGLISH,SCIENCE。
实验考虑以下四种情况:
一. 3 个字段都是等值查询,例如:
select * from "SYSDBA"."TEST" where MATH = 60 and SCIENCE = 60 and ENGLISH = 60;
查询执行计划如下:
这里是直接从索引中调取的结果。
二. MATH 不等值,ENGLISH 和 SCIENCE 两列等值,例如:
select * from "SYSDBA"."TEST" where MATH not in 60 and ENGLISH = 60 and SCIENCE=60;
通过执行计划可以看出并没有调用到索引。
三. MATH 和 ENGLISH 等值,第三列 SCIENCE 不等值,例如:
select * from "SYSDBA"."TEST" where MATH = 60 and ENGLISH =60 and SCIENCE not in 60;
执行计划有调用到 index_test 索引查询出 MATH=60 and ENGLISH=60 的所有值,再从里面选择出 science<>60 的值。
四、MATH 等值,后面两列不等值,例如:
select * from "SYSDBA"."TEST" where MATH = 60 and ENGLISH not in 60 and SCIENCE not in 60;
从执行计划来看也是没有利用到索引的。
通过这几种情况,我们可以得到组合索引的几个特点:
如果查询中经常会利用多个字段进行组合定位,我们可以在这几个字段上建立组合索引。
在做等值查询的时候,组合索引中各个列的顺序是无关紧要的,这个从实验结果一可以看出,列的顺序变化之后还能是正常的调用索引。
在做非等值查询的时候,需保证等值列在前,非等值列在后。从实验结果二和三的差别就可以看出来,这就要求我们在创建组合索引时关注列的顺序,需要按照实际查询的需求来建立索引。
查询时只能利用一个非等值字段,这就解释了为什么实验四中并没有调用到组合索引。
文章
阅读量
获赞