1、组合索引在 DM7 中 的 使用情况 在实际工作中,为了提高表查询的效率,我们 会 在表上创建 各种 索引。 但是,有时候我们虽然创建了组合索引,查询效率并没有提高,这是为什么呢?本文将带大家一探究竟。 实验背景: 1、 确认 数据库 版本 : DM Database Server x64 V7.1.6.46-Build(2018.02.08-89107)ENT 2、 创建测试用表 并录入测试数据 表结构如下 并 录入 10000 条测试数据 ,具体步骤可参考上一期干货分享 DM7 中产生随机数据的方法。 3、 创建索引 这个组合索引中,列的顺序为 MATH, ENGLISH, SCIENCE
2、 实验 考虑 以下 四种情况: 一 . 3 个字段都是等值查询,例如 查询执行计划如下: 1 #NSET2: 0, 1, 72 2 #PRJT2: 0, 1, 72; exp_num(6), is_atom(FALSE) 3 #BLKUP2: 0, 1, 72; index_test(TEST) 4 #SSEK2: 0, 1, 72; scan_type(ASC), index_test(TEST), scan_range(60,60,60),(60,60,60) 这里是直接从索引中调取的结果 二 . MATH 不等值, ENGLISH 和 SCIENCE 两列等值例如 通过 执行 计划可以看
3、出并没有调用到索引。 1 #NSET2: 1, 1, 72 2 #PRJT2: 1, 1, 72; exp_num(6), is_atom(FALSE) 3 #SLCT2: 1, 1, 72; (TEST.ENGLISH = 60 AND TEST.SCIENCE = 60 AND TEST.MATH 60 的值 1 #NSET2: 0, 1, 72 2 #PRJT2: 0, 1, 72; exp_num(6), is_atom(FALSE) 3 #SLCT2: 0, 1, 72; TEST.SCIENCE 60 AND TEST.SCIENCE 60) 4 #CSCN2: 1, 10000,
4、 72; INDEX33555484(TEST) 从执行计划来看也是没有利用到索引的 通过这几种情况,我们可以得到组合索引的几个特点: 1.如果 查询中经常会利用多个字段进行组合定位,我们可以在这几个字段上建立组合索引。 2.在做等值查询的时候,组合索引中各个列的顺序是无关紧要的 ,这个从实验结果一可以看出,列的顺序变化之后还能是正常的调用索引。 3.在做非等值查询的时候,需保证等值列在前,非等值列在后。从实验结果二和三的差别就可以看出来,这就要求我们在创建组合索引时关注列的顺序,需要按照实际查询的需求来建立索引。 4.查询时只能利用一个非等值字段,这就解释了为什么实验四中并没有调用到组合索引。