首页 > 数据库 >openGauss学习笔记-73 openGauss 数据库管理-创建和管理索引

openGauss学习笔记-73 openGauss 数据库管理-创建和管理索引

时间:2023-09-18 18:34:16浏览次数:38  
标签:p2 web tpcds 管理 索引 returns 73 address openGauss

openGauss学习笔记-73 openGauss 数据库管理-创建和管理索引

73.1 背景信息

索引可以提高数据的访问速度,但同时也增加了插入、更新和删除操作的处理时间。所以是否要为表增加索引,索引建立在哪些字段上,是创建索引前必须要考虑的问题。需要分析应用程序的业务处理、数据使用、经常被用作查询的条件或者被要求排序的字段来确定是否建立索引。

索引建立在数据库表中的某些列上。因此,在创建索引时,应该仔细考虑在哪些列上创建索引。

  • 在经常需要搜索查询的列上创建索引,可以加快搜索的速度。

  • 在作为主键的列上创建索引,强制该列的唯一性和组织表中数据的排列结构。

  • 在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的。

  • 在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间。

  • 在经常使用WHERE子句的列上创建索引,加快条件的判断速度。

  • 为经常出现在关键字ORDER BY、GROUP BY、DISTINCT后面的字段建立索引。

    img 说明:

    • 索引创建成功后,系统会自动判断何时引用索引。当系统认为使用索引比顺序扫描更快时,就会使用索引。
    • 索引创建成功后,必须和表保持同步以保证能够准确地找到新数据,这样就增加了数据操作的负荷。因此请定期删除无用的索引。
    • 分区表索引分为LOCAL索引与GLOBAL索引,一个LOCAL索引对应一个具体分区,而GLOBAL索引则对应整个分区表。
  • 在开启逻辑复制的场景下,如需创建包含系统列的主键索引,必须将该表的REPLICA IDENTITY属性设置为FULL或是使用USING INDEX指定不包含系统列的、唯一的、非局部的、不可延迟的、仅包括标记为NOT NULL的列的索引。

73.2 操作步骤

创建分区表的步骤请参考创建和管理分区表

73.2.1 创建索引

  • 创建分区表LOCAL索引tpcds_web_returns_p2_index1,不指定索引分区的名称。

    openGauss=# CREATE INDEX tpcds_web_returns_p2_index1 ON tpcds.web_returns_p2 (ca_address_id) LOCAL;
    

    当结果显示为如下信息,则表示创建成功。

    CREATE INDEX
    
  • 创建分区表LOCAL索引tpcds_web_returns_p2_index2,并指定索引分区的名称。

    openGauss=# CREATE INDEX tpcds_web_returns_p2_index2 ON tpcds.web_returns_p2 (ca_address_sk) LOCAL
    (
        PARTITION web_returns_p2_P1_index,
        PARTITION web_returns_p2_P2_index TABLESPACE example3,
        PARTITION web_returns_p2_P3_index TABLESPACE example4,
        PARTITION web_returns_p2_P4_index,
        PARTITION web_returns_p2_P5_index,
        PARTITION web_returns_p2_P6_index,
        PARTITION web_returns_p2_P7_index,
        PARTITION web_returns_p2_P8_index
    ) TABLESPACE example2;
    

    当结果显示为如下信息,则表示创建成功。

    CREATE INDEX
    
  • 创建分区表GLOBAL索引tpcds_web_returns_p2_global_index。

    openGauss=# CREATE INDEX tpcds_web_returns_p2_global_index ON tpcds.web_returns_p2 (ca_street_number) GLOBAL;
    

73.2.2 修改索引分区的表空间

  • 修改索引分区_web_returns_p2_P2_index_的表空间为example1。

    openGauss=# ALTER INDEX tpcds.tpcds_web_returns_p2_index2 MOVE PARTITION web_returns_p2_P2_index TABLESPACE example1;
    

    当结果显示为如下信息,则表示修改成功。

    ALTER INDEX
    
  • 修改索引分区_web_returns_p2_P3_index_的表空间为example2。

    openGauss=# ALTER INDEX tpcds.tpcds_web_returns_p2_index2 MOVE PARTITION web_returns_p2_P3_index TABLESPACE example2;
    

    当结果显示为如下信息,则表示修改成功。

    ALTER INDEX
    

73.2.3 重命名索引分区

执行如下命令对索引分区_web_returns_p2_P8_index_重命名_web_returns_p2_P8_index__new。

openGauss=# ALTER INDEX tpcds.tpcds_web_returns_p2_index2 RENAME PARTITION web_returns_p2_P8_index TO web_returns_p2_P8_index_new;

当结果显示为如下信息,则表示重命名成功。

ALTER INDEX

73.2.4 查询索引

  • 执行如下命令查询系统和用户定义的所有索引。

    openGauss=# SELECT RELNAME FROM PG_CLASS WHERE RELKIND='i' or RELKIND='I';
    
  • 执行如下命令查询指定索引的信息。

    openGauss=# \di+ tpcds.tpcds_web_returns_p2_index2 
    

73.2.5 删除索引

openGauss=# DROP INDEX tpcds.tpcds_web_returns_p2_index1;
openGauss=# DROP INDEX tpcds.tpcds_web_returns_p2_index2;

当结果显示为如下信息,则表示删除成功。

DROP INDEX

73.2.6 创建索引的方式

openGauss支持4种创建索引的方式请参见表1

img 说明:

  • 索引创建成功后,系统会自动判断何时引用索引。当系统认为使用索引比顺序扫描更快时,就会使用索引。
  • 索引创建成功后,必须和表保持同步以保证能够准确地找到新数据,这样就增加了数据操作的负荷。因此请定期删除无用的索引。

表 1 索引方式

索引方式 描述
唯一索引 可用于约束索引属性值的唯一性,或者属性组合值的唯一性。如果一个表声明了唯一约束或者主键,则openGauss自动在组成主键或唯一约束的字段上创建唯一索引(可能是多字段索引),以实现这些约束。目前,openGauss只有B-Tree可以创建唯一索引。
多字段索引 一个索引可以定义在表中的多个属性上。目前,openGauss中的B-Tree支持多字段索引,且最多可在32个字段上创建索引(全局分区索引最多支持31个字段)。
部分索引 建立在一个表的子集上的索引,这种索引方式只包含满足条件表达式的元组。
表达式索引 索引建立在一个函数或者从表中一个或多个属性计算出来的表达式上。表达式索引只有在查询时使用与创建时相同的表达式才会起作用。
  • 创建一个普通表
openGauss=# CREATE TABLE tpcds.customer_address_bak AS TABLE tpcds.customer_address;
INSERT 0 0
73.2.6.1 创建普通索引

如果对于tpcds.customer_address_bak表,需要经常进行以下查询。

openGauss=# SELECT ca_address_sk FROM tpcds.customer_address_bak WHERE ca_address_sk=14888;

通常,数据库系统需要逐行扫描整个tpcds.customer_address_bak表以寻找所有匹配的元组。如果表tpcds.customer_address_bak的规模很大,但满足WHERE条件的只有少数几个(可能是零个或一个),则这种顺序扫描的性能就比较差。如果让数据库系统在ca_address_sk属性上维护一个索引,用于快速定位匹配的元组,则数据库系统只需要在搜索树上查找少数的几层就可以找到匹配的元组,这将会大大提高数据查询的性能。同样,在数据库中进行更新和删除操作时,索引也可以提升这些操作的性能。

使用以下命令创建索引。

openGauss=# CREATE INDEX index_wr_returned_date_sk ON tpcds.customer_address_bak (ca_address_sk);
CREATE INDEX
73.2.6.2 创建多字段索引

假如用户需要经常查询表tpcds.customer_address_bak中ca_address_sk是5050,且ca_street_number小于1000的记录,使用以下命令进行查询。

openGauss=# SELECT ca_address_sk,ca_address_id FROM tpcds.customer_address_bak WHERE ca_address_sk = 5050 AND ca_street_number < 1000;

使用以下命令在字段ca_address_sk和ca_street_number上定义一个多字段索引。

openGauss=# CREATE INDEX more_column_index ON tpcds.customer_address_bak(ca_address_sk ,ca_street_number );
CREATE INDEX
73.2.6.3 创建部分索引

如果只需要查询ca_address_sk为5050的记录,可以创建部分索引来提升查询效率。

openGauss=# CREATE INDEX part_index ON tpcds.customer_address_bak(ca_address_sk) WHERE ca_address_sk = 5050;
CREATE INDEX
73.2.6.4 创建表达式索引

假如经常需要查询ca_street_number小于1000的信息,执行如下命令进行查询。

openGauss=# SELECT * FROM tpcds.customer_address_bak WHERE trunc(ca_street_number) < 1000;

可以为上面的查询创建表达式索引:

openGauss=# CREATE INDEX para_index ON tpcds.customer_address_bak (trunc(ca_street_number));
CREATE INDEX
  • 删除tpcds.customer_address_bak表

    openGauss=# DROP TABLE tpcds.customer_address_bak;
    DROP TABLE
    

标签:p2,web,tpcds,管理,索引,returns,73,address,openGauss
From: https://blog.51cto.com/shuchaoyang/7514249

相关文章

  • 软件工程 之 (XMUT)软件项目管理—课后习题及答案
    {mtitletitle="软件工程之(XMUT)软件项目管理—课后习题及答案"/}{lamp/}第一章一、填空题1.敏捷模型包括(4)个核心价值,对应(12)个敏捷原则。2.项目管理包括(启动过程组)、(计划过程组)、(执行过程组)、(控制过程组)、(收尾过程组)5个过......
  • leet code 735. 行星碰撞
    735.行星碰撞题目解析一道典型的运用单调栈解决的问题,元素入栈,然后当前元素和栈中元素相比较。最终得出结果。总结反思第一次遇到该问题的时候,脑海中没有丝毫关于单调栈的相关内容。想着双指针遍历数组解决问题。毫无疑问能够通过一些用例,不过不是正确的解。再次回顾,解决思路在脑......
  • 教程!基于树莓派+传感器+阿里云IoT的智能家居管理
    时隔一年半,才发现这篇内容怎么还在草稿箱里,怪不得那么多人问我问题,绷不住了以下代码均在同一文件夹下在终端执行运行run.py文件即可run.py1. #!/usr/bin/python32. 3. importaliLink,mqttd,rpi4. importtime,json5. importAdafruit_DHT6. importtime7. import......
  • 视频汇聚/视频云存储/视频监控管理平台EasyCVR分发rtsp流起播慢优化步骤详解
    安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力,也具备接入AI智能分析的......
  • 视频汇聚/视频云存储/视频监控管理平台EasyCVR分发rtsp流起播慢优化步骤详解
    安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力,也具备接入AI智能分析的......
  • 兼职任务管理系统开发
      拉新和兼职任务软件平台适合大部分的人做,更多还是以工作族,大学生等。  兼职任务管理系统主要服务于工作室模式,区域代理,高级用户,源码出售等模式。提供更加便捷,灵活,安全的管理方式,能够大大提高兼职管理的效率。  开发兼职拉新任务管理系统需要具备以下功能:  1.......
  • 人工湿地污水处理远程监控管理平台
    湿地作为生态系统的关键组成部分,发挥着涵养水源、调节气候、改善环境、维护生物多样性等生态功能。此外,湿地还具有保持水量平衡和水质净化的重要功能,对于防洪减灾、土壤保持和气候调节也发挥着重要作用。 随着环保技术的不断完善,人工湿地加污水处理的环境治理模式受到普及和推广。......
  • BMS电池管理系统的蓝牙芯片 国产高性能 低功耗蓝牙Soc芯片PHY6222
    电池管理系统是对电池进行监控与控制的系统,将采集的电池信息实时反馈给用户,同时根据采集的信息调节参数,充分发挥电池的性能。但是,前技术中,在管理多个电池时,需要人员现场调试与设置,导致其检查、维护与更新相当不方便。而且,针对电池组的工作性能、电池老化情况、使用寿命等信息,需要......
  • C#中的高级主题:内存管理、性能优化和安全性
    简介:欢迎来到C#语言入门指南的第十三篇博客!在之前的博客中,我们已经学习了C#的基础和一些高级编程概念。今天,我们将深入研究C#中的高级主题,包括内存管理、性能优化和安全性,以帮助您构建更出色的应用程序。让我们开始吧!1.内存管理:了解C#中的内存管理是非常重要的,它可以帮助您避免......
  • 鹏业电梯管理生态系统_电梯管理系统
    国家市场监督管理总局于近日发布《关于2022年全国特种设备安全状况的通告》,数据显示:截止2022年底,我国的电梯总量已达964.46万台,保有量高居世界第一。电梯保有量持续增长的同时,老旧电梯数量激增,电梯的维护维修需求也在逐年增大,保修期满后的电梯维护维修多数会申请小区的维修资金。据......