首页 > 其他分享 >KingbaseES 局部索引

KingbaseES 局部索引

时间:2022-09-03 09:23:32浏览次数:53  
标签:name idx text 局部 索引 pindex test KingbaseES

一个列要不要建立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 行记录)

标签:name,idx,text,局部,索引,pindex,test,KingbaseES
From: https://www.cnblogs.com/kingbase/p/16651965.html

相关文章

  • KingbaseES sys_blocking_pids 函数
    会话出现了锁等待,想要快速查询到堵塞的会话,可以使用sys_blocking_pids函数来实现这一目的。sys_blocking_pids:获取哪些会话阻塞了某个会话(输入参数).sys_backend_pid:......
  • vue3 基础-全局组件和局部组件
    组件和页面的关系可以理解为,组件是页面的一部分.形象地理解组件就和盖房子一样的,可以将房子粗略拆分3个组件(组成部分)房顶,房身,地基.同时房顶又可以拆分...........
  • KingbaseES sys_blocking_pids 函数
    会话出现了锁等待,想要快速查询到堵塞的会话,可以使用sys_blocking_pids函数来实现这一目的。sys_blocking_pids:获取哪些会话阻塞了某个会话(输入参数).sys_backend_pid:......
  • 在长字符串上创建索引
    目录背景解决方案1、创建示例表2、初始化数据3、查询3.1、确定区分度3.2、创建索引背景当在很长的字符串的字段上创建索引时,索引会变得很大而且低效。解决方案1、创建......
  • 查看Oracle当前用户下的(表,视图,同义词,索引等...)
     copy自:查看Oracle当前用户下的(表,视图,同义词,索引等...)表空间–查看当前用户表空间selectusername,default_tablespacefromuser_users;selectdefault_tablespace......
  • MySQL教程 - 索引(Index)
    更新记录转载请注明出处。2022年9月2日发布。2022年9月2日从笔记迁移到博客。索引说明是一种对数据表的一列或多列进行排序的数据结构索引是单独的、存储在磁盘......
  • 索引进阶 | 再谈 MySQL 的慢 SQL 优化
    索引可以提高数据检索的效率,降低数据库的IO成本。MySQL在300万条记录左右性能开始逐渐下降,虽然官方文档说500~800w记录,所以大数据量建立索引是非常有必要的。MySQL提供了......
  • Navicat中简单索引的使用(初级,已完善)
    本篇文章介绍一个使用Navicat完成SQL简单索引的案例,和之前的文章-Navicat中简单触发器的使用(初级,已完善)一样,本篇文章是能让新手快速将索引用起来,不过多介绍索引更深层次的......
  • 1Mybatis-Plus中逻辑删除与唯一索引冲突的解决方案
    1、背景用户删除后时重复添加同名用户报错,原因是因为删除用户时使用的是逻辑删除,并未从数据库中真实删除,由于用户信息还是比较重要的。2、关键代码片段Controller/......
  • Python中None作为索引的作用
    None的作用主要是在使用None的位置新增一个维度。a=np.arange(25).reshape(5,5)print(a)'''[[01234][56789][1011121314][1516171819]......