【SQL应知应会】索引 • Oracle版:B-树索引;位图索引;函数索引;单列与复合索引;分区索引
作者:mmseoamin日期:2023-12-21

请添加图片描述

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流

本文免费学习,自发文起3天后,会收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习,有基础也有进阶,有MySQL也有Oracle

请添加图片描述

索引 • MySQL版

  • 前言
  • 一、Oracle索引
  • 1.索引概述及分类
    • B-树索引
    • 位图索引
    • 函数索引
    • 唯一性索引与非唯一性索引
    • 单列索引与复合索引
    • 2. 索引使用原则
    • 3.创建索引
      • 3.1 索引创建语法
      • 3.2 索引创建案例
        • 3.2.1 例1:非唯一性索引
        • 3.2.2 例2:唯一性索引
        • 3.2.3 例3:位图索引
        • 3.2.4 例4:函数索引
        • 4.分区索引
          • 3.1分区索引概念
          • 2.分区索引案例
            • 2.1 创建本地分区索引
            • 2.2全局分区索引
            • 3.全局非分区索引

              前言

              ✅今天继续SQL的索引的第 4 篇文章,主要讲到了Oracle的索引:从有哪些索引出发,到索引的使用原则,针对每种索引进行创建演示,最后是分区索引的认识和使用

              ✴️文章中提供了代码和很具体的截图,代码是为了减轻大家学习的难度,同时用截图可以更形象的让大家去理解知识点想要表达的意思,希望大家跟着一起学起来

              💖希望文章的内容对大家有所帮助,如果有什么不足的地方,大家可以在评论区或者私信我,感谢大家的支持

              💻那么,快拿出你的电脑,跟着文章一起学习起来吧

              一、Oracle索引

              1.索引概述及分类

              • 索引是一种提高数据检索效率的数据库对象, 能够为数据的查询提供快捷的存取路径, 减少磁盘 I/O。

              • 虽然索引是基于表而建立的, 但索引并不依赖于表。

              • 索引由系统自动维护和使用,不需要用户参与。

              • Oracle 数据库为了提高数据检索性能, 提供了多种类型的索引, 以满足不同的应用需求。

                B-树索引

                • 按平衡树结构组织的索引, 是最常用的索引, 也是默认创建的索引类型。
                • B-树索引占用空间多, 适合索引值取值范围广( 基数大) 、 重复率低的应用。

                  位图索引

                  • 按位图结构组织的索引, 适合索引值取值范围小( 基数小), 重复率高的应用。

                    函数索引

                    • 基于包含索引列的函数或表达式创建的索引( 索引值为计算后的值)。

                      唯一性索引与非唯一性索引

                      • 唯一性索引是索引值不重复的索引, 非唯一性索引是索引值可以重复的索引。 在默认情况下, Oracle 创建的索引是非唯一性索引。 当在表中定义主键约束或唯一性约束时, Oracle 会自动在相应列上创建唯一性索引。

                        单列索引与复合索引

                        • 索引可以创建在一个列上, 也可以创建在多个列上。 创建在一个列上的索引称为单列索引, 创建在多个列上的索引称为复合索引。

                          2. 索引使用原则

                          由于索引作为一个独立的数据库对象存在, 占用存储空间, 并且需要系统进行维护, 因此索引的使用需要遵循下列原则:

                          • 导入数据后再创建索引

                          • 在适当的表和列上创建适当的索引

                            • 如果经常查询的记录数目少于表中记录总数的5%时就应当创建索引;
                            • 如果经常进行连接, 应该在连接列上建立索引;
                            • 对于取值范围很大的列应当创建 B 树索引, 而对于取值范围很小的列应当创建位图索引
                            • 合理设置复合索引中列的顺序, 应将频繁使用的列放在其他列的前面

                            • 限制表中索引的数目。 表中索引数目越多, 查询速度越快, 但表的更新速度越慢

                            • 选择存储索引的表空间。 在默认情况下, 索引与表存储在同一表空间中【MySQL的MyISAM引擎是索引与数据是分开的,InnoDB引擎就是索引和数据在一起】

                              3.创建索引

                              3.1 索引创建语法

                              create [unique] [bitmap] index on [schema.]table(column[asc|desc][,...]) [reverse] [parameter_list];
                              其中:
                              unique 表示建立唯一性索引
                              bitmap 表示建立位图索引
                              asc|desc 用于指定索引值的排列顺序,asc表示按升序排列,desc表示按降序排序(默认值为asc)
                              reverse 表示建立反键索引
                              parameter_list 用于指定索引的存放位置、存储空间分配和数据块参数设置
                              

                              3.2 索引创建案例

                              3.2.1 例1:非唯一性索引

                              • 在emp表的last_name列上创建一个非唯一性索引
                                create index emp_lname_index on emp(last_name) tablespace index;
                                ## tablespace index 表示索引存储在名为 index 的表空间中,也就是说,数据将会在此表空间中进行存储和管理
                                

                                3.2.2 例2:唯一性索引

                                • 在emp表的email列上创建一个唯一性索引
                                  create unique index emp_email_index on emp(email) tablespace index;
                                  

                                  3.2.3 例3:位图索引

                                  • 在emp表的job_id列上创建一个位图索引
                                    create bitmap index emp_job_index on emp(job_id)  tablespace index;
                                    

                                    3.2.4 例4:函数索引

                                    • 基于emp表的first_name 列创建一个函数索引
                                      create index emp_fname_index on emp(upper(first_name))  tablespace index;
                                      

                                      4.分区索引

                                      • 在Oracle数据库中,索引与表时相互独立的,索引是否分区 与 表是否分区 没有直接关系

                                      • 不分区的表可以创建分区索引和不分区索引,分区的表也可以创建分区索引或不分区的索引,如下图所示

                                        在这里插入图片描述

                                        3.1分区索引概念

                                        • 在Oracle数据库中,分区索引分为本地分区索引和全局分区索引

                                        • 本地分区索引是指为分区表中的各个分区单独创建索引分区,各个索引分区之间是相互独立的,索引的分区与表的分区是一一对应的,如下图所示,为分区表创建了本地分区索引后,Oracle会自动对表的分区和索引的分区进行同步维护

                                          在这里插入图片描述

                                        • 全局分区索引是指先对整个表建立索引,然后再对索引进行分区。索引的分区之间不是相互独立的,索引分区与表分区之间也不是一一对应的,如下图6-3所示;也可以为分区表创建非分区的全局索引,如下图6-4所示

                                          在这里插入图片描述

                                          2.分区索引案例

                                          2.1 创建本地分区索引

                                          • 分区表创建后,可以对分区表创建本地分区索引,在指明分区方法时使用local关键字标识本地分区索引
                                            # 例:在student_range分区表的sname列上创建本地分区索引
                                            create index student_range_local on student_range(sname) local
                                            

                                            2.2全局分区索引

                                            • 与表分区方法类似,索引分区方法也包括范围分区、列表分区、散列分区和复合分区等,在指明分区方法时使用global关键字标识全局分区索引
                                              # 例:为分区表student_list的sage列建立基于范围的全局分区索引
                                              create index student_list_global on student_list(sage) global 
                                              partition by range(sage)
                                              (
                                                  partition p1 values less than (80) tablespace orcltbs1,
                                                  partition p1 values less than (maxvalue) tablespace orcltbs2
                                              )
                                              

                                              3.全局非分区索引

                                              • 为分区表创建全局非分区索引与为标准表创建索引一样
                                                # 例:为分区表student_list_index创建全局非分区索引
                                                create index student_list_index on student_list_index(sname) tablespace index
                                                

                                                😘感谢大家耐心的看完这篇文章,这篇文章是SQL索引的第4篇文章,关于Oracle的索引

                                                ✅如果大家觉着内容还算可以,那么就关注一下爱书不爱输的程序猿吧

                                                🏡也可以加入我的社区一起学习呀

                                                🎁各种专栏,精彩不断

                                                • SQL应知应会专栏,对于数据库的一些学习,有基础也有进阶,有MySQL也有Oracle
                                                • UML应知应会专栏,对于UML的一些讲解,应有尽有
                                                • … … 还有java的专栏、算法与数据结构的专栏等其他专栏,快去我的主页关注我吧

                                                请添加图片描述