一个列要不要建立btree索引,判断条件是其键值分布是否够离散,比如主键、唯一键,可以建立索引。如果这个列有大量重复的值,则建立索引没有意义。

在生产环境中常会碰到键值分布不均匀的列,如表t1有一个名为FLAG的列,有0,1,2三个值,其中值为0的记录占95%,值为1的占3%,2占2%。在FLAG上建立索引,搜索FLAG=1或2可利用到此索引,而搜索FLAG=0 则因有大量的重复值而利用不到此索引。也就是说此索引有95%的内容是无效的,白白浪费了存储等资源。

KingbaseES有种索引,叫Partial Index(局部索引)可以很好的解决以上问题。

1 什么是partial index

局部索引是基于表中部分数据建立的,被索引的部分数据是原数据的一个子集。这个子集数据是基于某些条件可以明确计算出来的。

2 partial index适用场景

对于表中数据分布“不均匀”的场景,比如某些数据占据绝大多数,而其它一些数据只占少量,且要满足查询条件针是对那些小数据量的查询情形。

通过partial index可以排除大量普通数据或业务上“不感兴趣”的数据。

3 partial index的优势

由于其是针对部分数据进行索引,显然同传统b-tree索引相比,其所占磁盘空间将大大缩小。当重建维护这些分区索引时,速度也非常快。

test=# create table t_pindex(id int,name varchar(30));
CREATE TABLE
test=# insert into t_pindex select generate_series(1,2000),'AAA';
INSERT 0 2000
test=# insert into t_pindex select generate_series(2001,2050),'BBB';
INSERT 0 50
test=# create index idx_pindex on t_pindex(name) where name != 'AAA';
CREATE INDEX
test=# create index idx_full on t_pindex(name);
CREATE INDEX
test=# analyze t_pindex; 在本例子中AAA值占比超过95%,所以即使列上有索引也不会使用索引扫描
test=# explain analyze select * from t_pindex where name = 'AAA';
QUERY PLAN
----------------------------------------------------------------------------------------------------------
Seq Scan on t_pindex (cost=0.00..35.62 rows=2000 width=8) (actual time=0.036..18.522 rows=2000 loops=1)
Filter: ((name)::text = 'AAA'::text)
Rows Removed by Filter: 50
Planning Time: 0.266 ms
Execution Time: 35.368 ms
(5 行记录) 局部索引的存储空间比普通索引的存储空间要小。
test=# \di+ idx_full
关联列表
-[ RECORD 1 ]------
架构模式 | public
名称 | idx_full
类型 | 索引
拥有者 | system
数据表 | t_pindex
大小 | 64 kB
描述 | test=# \di+ idx_pindex
关联列表
-[ RECORD 1 ]--------
架构模式 | public
名称 | idx_pindex
类型 | 索引
拥有者 | system
数据表 | t_pindex
大小 | 16 kB
描述 | 使用hint指定查询时使用的索引,可以看出局部索引的查询效率会高于普通的索引。
test=# explain analyze select /*+ indexscan(a idx_pindex) */ * from t_pindex a where name = 'BBB';
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------
Index Scan using idx_pindex on t_pindex a (cost=0.14..13.02 rows=50 width=8) (actual time=0.025..0.392 rows=50 loops=1)
Index Cond: ((name)::text = 'BBB'::text)
Planning Time: 0.084 ms
Execution Time: 0.785 ms
(4 行记录) test=# explain analyze select /*+ indexscan(a idx_full) */ * from t_pindex a where name = 'BBB';
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------
Index Scan using idx_full on t_pindex a (cost=0.28..9.15 rows=50 width=8) (actual time=0.060..0.668 rows=50 loops=1)
Index Cond: ((name)::text = 'BBB'::text)
Planning Time: 0.154 ms
Execution Time: 1.760 ms
(4 行记录)

KingbaseES 局部索引的更多相关文章

  1. KingbaseES 全局索引

    概述:在分区表上创建的索引可分为全局索引和本地索引.全局索引包括全局非分区索引(Global Nonpartitioned Indexes)和全局分区索引(Global Partitioned Ind ...

  2. KingbaseES 全局索引是否因为DDL操作而变为Unusable ?

    前言 Oracle 在对分区做DDL操作时,会使分区全局索引失效,需要加上关键字update global indexes.KingbaseES 同样支持全局索引.那么,如果对分区表进行DDL操作,那 ...

  3. Oracle分区索引

    索引与表类似,也可以分区: 分区索引分为两类: Locally partitioned index(局部分区索引) Globally partitioned index(全局分区索引) 下面就来详细解 ...

  4. MySQL3:索引

    什么是索引 索引是对数据库表中一列或者多列的值进行排序的一种结构,所引用于快速找出在某个列中有一特定值的行.不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行.表越大,查询数据所花 ...

  5. Oracle索引简单介绍与示例

    索引的三大特性 1索引高度 在SQL检索数据(SELECT)的时候,索引的高度的不同对检索的效率有明显的差别,数据库访问索引需要读取的数据块通常是索引的高度+1个数据块数,也就是说索引的高度越高,访问 ...

  6. MongoDB学习笔记——索引管理

    索引 索引能够提升查询的效率.没有索引,MongoDB必须扫描集合中的所有文档,才能找到匹配查询语句的文档. 索引是一种特殊的数据结构,将一小块数据集保存为容易遍历的形式.索引能够存储某种特殊字段或字 ...

  7. oracle 的索引

    一.索引分类      按逻辑分: 单列索引(Single column):  单列索引是基于单列所创建的索引 复合(多列)索引(Concatenated ): 复合索引是基于两列或者多列所创建的索引 ...

  8. Oracle数据库——索引、视图、序列和同义词的创建

    一.涉及内容 1.理解索引的概念和类型. 2.掌握创建索引的命令. 3.理解视图的概念和优点. 4.理解可更新视图应具备的特点. 5.掌握创建一般视图和可更新视图的命令. 6.理解序列和同义词的概念和 ...

  9. 详谈 oracle 索引 (笔记)

    1.oracle索引空值问题 当在有空值得列上建立单列索引时,如果搜索条件为 is null 在解释计划中可以看到,对于此列oracle并没有使用索引查询: 但是当建立的是多列索引是,就会按照索引来进 ...

随机推荐

  1. 关于各种Vue UI框架中加载进度条的正确使用

    这里拿MUSE UI 中的进度条举例 <mu-circular-progress :size="40" class="icon" v-if="i ...

  2. SAP Web Dynpro-协助类

    在Web Dynpro组件中,您可以创建从抽象类继承的唯一分配的类. 协助类可以存储组件中必需的但未与布局链接的编码. 您可以将动态文本存储在协助类中,也可以在运行时合并文本,也可以将变量存储在文本池 ...

  3. Java实现无界面计算器

    ## 要求### 1.四个方法加减乘除### 1.循环加switch### 1.传递2个数源码如下: ``` public class Jisuanqi { public static void ma ...

  4. Python音频处理基础知识,这不是轻轻松松~~~

    大家好鸭,我是小熊猫 咱今天来讲一讲音频处理的基础知识上才艺~~~ 1.声音的基础 2.python读取.wav音频 欢迎加入白嫖Q群:660193417### import wave import ...

  5. Mybatis+SpringBoot 项目All elements are null

    xml文件内容如下 查出来的集合长度是有的,但是会出现All elements are null 解决方案: 注意我的xml文件全部是这样的,并且我调用的sql返回值是  resultType=&qu ...

  6. GaussDB(for MySQL) :Partial Result Cache,通过缓存中间结果对算子进行加速

    摘要:华为云数据库高级内核技术专家详解GaussDB(for MySQL)Partial Result Cache特性,如何通过缓存中间结果对算子进行加速? 本文分享自华为云社区<GaussDB ...

  7. NC14585 大吉大利,今晚吃鸡

    NC14585 大吉大利,今晚吃鸡 题目 题目描述 糖和抖m在玩个游戏,规定谁输了就要请谁吃顿大餐:抖m给糖a b c三个驻, 并在a柱上放置了数量为n的圆盘,圆盘的大小从上到下依次增大,现在要做的事 ...

  8. Tapdata 实时数据融合平台解决方案(四):技术选型

    作者介绍:TJ,唐建法,Tapdata 钛铂数据CTO,MongoDB中文社区主席,原MongoDB大中华区首席架构师,极客时间MongoDB视频课程讲师. 常见搭建数据中台的技术产品 数据中台包括: ...

  9. JetBrains系列软件激活

    1.将以下记录加入hosts文件 0.0.0.0 account.jetbrains.com0.0.0.0 www.jetbrains.com 2.激活方式选择licence server,填写以下激 ...

  10. JavaScript进阶内容——DOM详解

    JavaScript进阶内容--DOM详解 当我们已经熟练掌握JavaScript的语法之后,我们就该进入更深层次的学习了 首先我们思考一下:JavaScript是用来做什么的? JavaScript ...