iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Oracle学习笔记(一)——B-Tree索引
  • 117
分享到

Oracle学习笔记(一)——B-Tree索引

Oracle学习笔记(一)——B-Tree索引 2021-03-01 15:03:46 117人浏览 猪猪侠
摘要

https://blog.csdn.net/biww620/article/details/73003880     目录是索引的一个最好的例子,每条目录包含对应章节的标题和页码,类比索引的每条索引项包含了数据记录的某些键值组合并

Oracle学习笔记(一)——B-Tree索引

https://blog.csdn.net/biww620/article/details/73003880

 

  目录是索引的一个最好的例子,每条目录包含对应章节的标题和页码,类比索引的每条索引项包含了数据记录的某些键值组合并包含了对应数据块的访问路径(rowid)。目录的存在就是为了快速定位到感兴趣的内容,索引的存在也是问了加快对表数据的随机访问。

        常常被提及的索引可能有单键索引、组合索引、唯一索引、B-Tree索引、位图索引、函数索引、全局索引、局部索引等等。这里只是列举出镜率较高的索引类型,并没有去做严格的划分,各类型间有重叠,比如函数索引可以是B-Tree索引也可以是位图索引。在oracle中索引和表一样属于逻辑结构中的段(segment)。每个索引都拥有独立的结构,无论是从物理结构还是逻辑结构来看与其所关联的表完全分开,即便索引失效也不会造成原有sql无法执行,只是改变了执行计划,降低了执行效率。

B-Tree索引
        查找树有完全二叉树、二叉查找树、平衡二叉树、红黑树,B-Tree,B+-Tree,B*-Tree等。对于二叉树其目的是要将查询复杂度控制在O(lgN)以内。(注:这里的lgN表示log2N),查询效率与树的高度有关。在少量数据构造的二叉树查询是很高效的,但是在数据库应用中,数据量巨大,如果构造二叉树那么树的高度将也很巨大,势必增加读取索引节点的I/O次数,影响查询效率。于是B-Tree挺身而出,在很大的数据量范围内能够保持B-Tree树的层级不会增加。

图片来自网络

从上图中可以看出在oraccle中B-Tree索引具有以下结构特点:
B-Tree索引包含根节点(Root node)、分支节点(Branch Node)和叶子节点(Leaf Node)。
索引树高度一般都很低,上百亿记录的索引树的高度也只有5,6层。
索引本身有序。叶子节点是一个双向链表,因此可以按照索引的升序或降序进行索引扫描。
索引项包含键值信息和ROWID。索引项由索引头部、索引列的长度、索引值以及对应记录的rowid。其中唯一索引对应的rowid是唯一的,非唯一索引对应的rowid是可能有多个(多个rowid是有序的)。
索引列值全部为NULL的索引项是不会被记录的。
B-Tree索引简要分析
一、提高查询效率
200w条记录的表test_index_t1,查找条件col1 = 98765的记录没有索引的执行计划如下:


在test_index_t1表的col1列添加索引
create index index_col1 on test_index_t1(col1);
再次执行查询的执行计划如下:


未建立索引时执行计划是TABLE ACCESS FULL用时1100ms,建立索引后执行计划是INDEX RANGE SCAN用时90ms,效率提高了10倍以上。这里test_index_t1的数据量不大。如果是大数据量的表执行效率的差距会更加明显。
二、索引树高度较低
通过以下sql可以查询索引的统计信息,其中BLEVEL表示索引树的高度,高度为BLEVEL +  1
SELECT
index_name,
blevel,
leaf_blocks,
num_rows,
distinct_keys,
clustering_factor
FROM
user_ind_statistics
WHERE
table_name = UPPER("test_index_t1");

对于200w条记录的表test_index_t1执行索引统计信息查询后得到的结果为:

        可以看出BLEVEL = 2也就是说索引树的高度为3。构建了记录数分别为10条,20w条和300w条的表并建立相同的索引,索引树高度分别为2,2,3。因此可以看出B-Tree索引的高度是比较低的,能够在大数据量的情况下保证树高度值很低。在通过索引执行查询时一个层级往往就代表一次I/O操作,因此保持索引树高度较低对查询性能有很大的好处。
三、索引包含键值
       索引包含索引键值,单键或键组合,如果查询所需的字段均在索引项中则可以避免回表读数,提高查询性能。创建表test_index_t1包含三个字段col1,col2,col3初始化为300w条记录,并建立了(col1,col2)组合索引。
create index index_col1_col2 on test_index_t1(col1, col2);
1. 执行sql 
select col1 from test_index_t1 where col1 between 10 and 20;


2. 执行sql
select col1, col2 from test_index_t1 where col1 between 10 and 20;

 

执行sql
select * from test_index_t1 where col1 between 10 and 20;

从上面三次查询结果可以看出:
     (1) 三次执行SQL均用到了索引INDEX_COL1_COL2,索引执行方式为Index Range Scan
     (2) 第一次和第二次查询(col1)、(col1、col2)均未回表读数,而第三次查询存在TABLE ACCESS BY INDEX ROWID回表读数,原因是组合索引INDEX_COL1_COL2中不包含列col3,因此通过索引扫描得到最终记录的rowid后还会根据rowid到表中读取col3。
      总体来看,如果所需列包含于索引中那么可以通过索引避免回表读数从而提高查询性能。但需要注意的是索引本身也有性能消耗,并不是包含的列越多越好。一般建议索引列不超过3个,从实际的经验来看5,6个也还是可以接受。
四、索引本身有序
      在前面提到的索引结构中可以看出索引叶子结点本身是按照索引键升序排列,相当于一个双向链表,可以进行升序或降序扫描。删除test_index_t1表的索引,再执行查询
select col1, col2 from test_index_t1 where col1 between 10 and 20 order by col1;


从执行计划和统计信息中可以看出执行了排序过程并使用了内存空间。给test_index_t1表col1字段加上索引后的执行计划如下

        执行计划走索引后SORT ORDER BY不存在了。因此,如果因为排序导致查询性能降低可以考虑在索引中包含需要排序的列,这样利用索引本身的有序性可以避免排序带来的性能损耗。
五、索引不保存索引键值全部为NULL的记录
         这个特点跟count,sum/avg,max/min的执行计划息息相关,可以总结为以下两点:
COUNT/SUM/AVG必须在索引列为非空的情况下才可以走到索引。(建表是列指定为Not Null或为主键或在where条件中指明为is not null)。
MIN/MAX则不会受到空值的影响,均能走到索引。
表test_index_t1有300w条记录,在col1上建立了索引,执行:
select count(1) from test_index_t1;


可以看出是走了全表扫描。在where条件中增加col1 is not null后的执行计划为:

用INDEX FAST FULL SCAN的方式使用索引INDEX_COL1。最后col1添加属性not null后的执行计划为:

可以看出给列col1添加了not null属性后执行计划跟在where条件中指明is not null相同。这里不再对sum/avg,min/max做验证。
————————————————
版权声明:本文为CSDN博主「biww620」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:Https://blog.csdn.net/biww620/java/article/details/73003880

您可能感兴趣的文档:

--结束END--

本文标题: Oracle学习笔记(一)——B-Tree索引

本文链接: https://www.lsjlt.com/news/5737.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Oracle学习笔记(一)——B-Tree索引
    https://blog.csdn.net/biww620/article/details/73003880     目录是索引的一个最好的例子,每条目录包含对应章节的标题和页码,类比索引的每条索引项包含了数据记录的某些键值组合并...
    99+
    2021-03-01
    Oracle学习笔记(一)——B-Tree索引
  • mysql学习笔记之索引类型B-TREE介绍
    B-tree索引是MySQL数据库中使用最为频繁的索引类型,特别是在innodb中经常使用;在其他数据库中b-tree索引也同样是作为最主要的索引类型的,这主要是因为b-tree索引的存储结构在数据库的数据检索中有着非常优异的表现。 这种索...
    99+
    2022-02-03
    mysql学习笔记之索引类型B-TREE介绍
  • MySQL学习笔记(9):索引
    本文更新于2019-07-27,使用MySQL 5.7,操作系统为Deepin 15.4。 目录能够使用索引的典型场景存在索引但不能使用索引的典型场景查看索引使用情况 在创建一个n列的复合索引时,实际是创建了n个索引。可利用索引中...
    99+
    2018-09-17
    MySQL学习笔记(9):索引
  • Oracle学习笔记之视图及索引的使用
    目录一、视图的使用1.概念2.视图分类3.视图语法4.视图实例 二、索引1.索引概念2.索引分类2.1、按物理存储方式分类2.2、按逻辑功能分类3.索引原则4.索引语法一、视图的使用 1.概念 视图概念:&nb...
    99+
    2022-07-19
    Oracle视图使用 Oracle索引使用
  • 【MongoDB学习笔记20】MongoDB的索引
    MongoDB的索引和关系型数据库的索引概念和功能是相同的:(1)不使用索引的搜索可以称为全表扫面,也就是说,服务器必须找完整个表才能查询整个结果;(2)建立索引后搜索,查询在索引中搜索,在索引的条目中找到...
    99+
    2022-10-18
  • MySql学习笔记(九):索引失效
    数据准备:CREATE TABLE `t_blog` (   `id` int(11) NOT NULL auto_increment,   `title` varchar(50) default...
    99+
    2022-10-18
  • 【MongoDB学习笔记27】MongoDB的TTL索引
    TTL索引(time-to-live index)允许为每一个文档设置一个超时时间,文档超过这个时间就会被删除。在ensureIndex中指定expireAfterSecs选项就可以创建一个TTL索引:&g...
    99+
    2022-10-18
  • 【MongoDB学习笔记21】MongoDB的复合索引
    索引的值是按照一定顺序排列的,因此使用索引键对文档进行搜索排序比较快;但是只有首先使用索引进行排序时,索引才有用;例如下面的排序里,“username”上的索引就没有起作用:> db.use...
    99+
    2022-10-18
  • 学习笔记 12 数据库索引和锁
    索引是为了提高查询的效率。常见的索引模型有hash索引,有序数组,二叉树索引。hash索引:hash表是一种以键值对存储的数据结构,适用于等值查询场景;由于数据不是有序存储的,所以范围查询时效率比较差。有序...
    99+
    2022-10-18
  • 【MongoDB学习笔记22】MongoDB的索引管理
    使用ensureIndex函数创建集合的索引。对集合而言,每个索引只需要创建一次,重复创建没有任何作用;> show collections    s...
    99+
    2022-10-18
  • 【MongoDB学习笔记25】MongoDB的索引类型
    创建索引可以指定一些选项,使用不同的选项建立的索引会有不同的行为。 一、唯一索引唯一索引可以确保每一个文档的指定键都有唯一的值。例如,想确定文档中的username键不重复,创建一个唯一索引:&g...
    99+
    2022-10-18
  • PHP学习笔记:搜索引擎与全文检索
    引言:搜索引擎和全文检索是现代Web开发中非常重要的功能。无论是电商网站、新闻门户还是博客网站,几乎所有的网站都需要提供快速准确的搜索功能,以便用户能够迅速找到所需要的信息。 在PHP中,我们可以借助一些强大的开源库来实现搜索引擎和全文检索...
    99+
    2023-10-21
    - PHP学习笔记 - 搜索引擎 - 全文检索
  • Java和Django学习笔记:如何建立一个完美的索引?
    在Web开发中,索引是非常重要的一部分,它可以提高查询效率,加快数据检索速度。本文将介绍如何在Java和Django中建立一个完美的索引。 一、Java中的索引建立 Java是一种面向对象的编程语言,它提供了许多数据结构和算法库,可以方便...
    99+
    2023-10-06
    django 学习笔记 索引
  • 如何创建一个完整的Java和Django学习笔记索引?
    学习编程语言需要记录笔记,这样可以加深对知识的理解并且方便以后的回顾。但是,当你记录笔记的时候,你会发现你的笔记越来越多,难以管理。如果你正在学习Java和Django,你可能需要一个索引来管理你的笔记。这篇文章将介绍如何创建一个完整的J...
    99+
    2023-10-06
    django 学习笔记 索引
  • MySql学习笔记(七):explain-索引的使用情况
    主要内容:explain的possible_key、key、key_len、ref、rows入门。1、possible_key表示在查询过程中可能用到的索引。查询涉及到的字段上如果有索引,则该索引会出现在p...
    99+
    2022-10-18
  • ASP 大数据索引是什么?学习笔记分享!
    随着互联网和大数据时代的到来,数据量的增加以及数据分析的需求不断升高,索引在数据库中扮演着极为重要的角色。ASP 大数据索引作为一种高效的索引技术,受到了越来越多的关注。本文将详细介绍 ASP 大数据索引的概念、使用方法以及优缺点。 一、...
    99+
    2023-10-22
    大数据 索引 学习笔记
  • PHP学习笔记:数据库优化与索引设计
    在开发Web应用程序时,数据库操作是一个非常关键的环节。数据库的性能直接影响着Web应用程序的响应速度和用户体验。为了提升数据库的效率和查询速度,我们需要进行数据库优化和索引设计。一、数据库优化数据库架构优化:正规化设计:遵循数据库范式,减...
    99+
    2023-10-21
    PHP 数据库优化 索引设计
  • 【MongoDB学习笔记23】MongoDB的索引对象和数组
    MongoDB允许深入文档内部,对嵌套字段和数组建立索引;嵌套对象和数组字段可以和复合索引中的顶级字段一起使用,多数情况下与“正常”索引字段的行为也是一致的。 一、索引嵌套文档例如,集合中的文档如...
    99+
    2022-10-18
  • 学习 ASP 大数据索引,这些笔记能否助你一臂之力?
    ASP.NET 是一种用于构建基于 Web 的应用程序的开放源代码 Web 应用程序框架。它是 Microsoft 提供的一种用于开发 Web 应用程序的工具,可用于构建强大的 Web 应用程序和网站。在 ASP.NET 中,大数据索引是...
    99+
    2023-10-22
    大数据 索引 学习笔记
  • ASP 大数据索引学习笔记,带你掌握全面的索引知识!
    随着大数据时代的到来,数据量不断增加,如何高效地查询数据成为了一项重要的技能。索引作为一种常用的数据结构,可以帮助我们在海量数据中快速定位所需信息。本篇文章将带你深入学习 ASP 大数据索引,掌握全面的索引知识。 一、什么是索引? 索引是...
    99+
    2023-10-22
    大数据 索引 学习笔记
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作