一个列要不要建立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. BUUCTF-面具下的flag

    面具下的flag 010editor打开发现存在ZIP binwalk -e mianju.jpg 分离压缩包出来 但是存在密码.猜测是伪加密,直接编辑器搜504B0102找到第五组字符组改为00即可 ...

  2. JavaScript中动态生成表格

    动态生成表格,首先需要输入并获取动态的数字,html中结构代码如下:行:<input type="text" id="row" value="5 ...

  3. JavaScript中DOM查询封装函数

    在JavaScript中可以通过BOM查询html文档中的元素,也就是所谓的在html中获取对象然后对它添加一个函数. 常用的方法有以下几种: ①document.getElementById() 通 ...

  4. SAP 实例 9 Text output

    REPORT demo_show_text. CLASS demo DEFINITION. PUBLIC SECTION. CLASS-METHODS main. ENDCLASS. CLASS de ...

  5. VisionPro · C# · 图像显示十字光标

    程序通过 CogRecordDisplay 显示控件显示视觉运行结果图像,当我们对调试时,可能需要用到图像中心十字对位光标. 本文通过VisionPro两个拟合线工具,一个拟合圆工具在图像中画出光标, ...

  6. 静态代码块和数组工具类Arrays

    静态代码块 静态代码块:定义在成员位置,使用static修饰的代码块{ }. ~位置:类中方法外. ~执行:随着类的加载而执行且执行一次,优先于main方法和构造方法的执行 格式: public cl ...

  7. 【python】M3U8下载器脚本

    [python]M3U8下载器脚本 脚本目标: 1. 输入M3U8文件的链接,得到视频 2.使用异步操作,这样可以快很多,不加锁,因为懒得写,而且影响不大 已知条件: 1.m3u8文件其实就是一个记录 ...

  8. 服务器宕机了,Kafka 消息会丢失吗?

    大家好,我是树哥. 消息队列可谓是高并发下的必备中间件了,而 Kafka 作为其中的佼佼者,经常被我们使用到各种各样的场景下.随着 Kafka 而来得,还有三个问题:消息丢失.消息重复.消息顺序.今天 ...

  9. Java的main函数(命令行传参)

    javac :编译命令 java  :执行命令

  10. nginx虚拟主机测试

    一.基于域名的nginx虚拟主机 基于域名的nginx虚拟主机的操作步骤: 1 .为虚拟主机提供域名和IP的映射(也可以使用DNS正向解析) echo "172.16.10.101 www. ...