数据库索引知识点整理

初识索引

索引的概念

索引是定义在存储表的基础上,有助于无需检查所有记录而快速定位所需记录的一种辅助存储结构,由一系列存储在磁盘上的索引项组成,每一索引项又由两部分构成。即索引字段和行指针。

索引字段

由表中某些列通常是一列中的值串接而成。索引中通常存储了索引字段的每一个值。

行指针

指向表中包含索引字段值的记录在磁盘上的存储位置。

存储索引项文件的为索引文件,存储表称为主文件。

索引文件组织方式

(相对照的,主文件组织有堆文件,排序文件,散列文件,聚簇文件等多种方式)

排序索引文件:按索引字段值的某一种顺序组织存储

散列索引文件:依据索引字段值使用散列函数分配散列桶的方式存储

索引的作用

在一个表上针对不同属性或者属性组合建立不同的索引文件,索引字段值可以是表中任何一个属性的值或者属性值的组合;

索引文件比主文件小得多,通过检索一个小的索引文件(可以完全装载进内存),快速定位之后,再有针对性的读取非常大的主文件中的相关记录;

有索引时,更新操作必须同步更新索引文件和主文件。保持其数据一致性。

SQL语言中的索引创建与维护

基础知识

当定义table之后,如果定义了主键,系统自动生成主索引;

索引可以由用户定义或者撤销;

当索引被创建后,不论是主索引还是用户定义的索引,DBMS都将自动维护所有索引;

当table被删除之后,定义在该表上的所有索引自动撤销。

创建,撤销索引

CREATE INDEX idxSname ON Student(Sname);
DROP INDEX idxSname;

稠密索引与稀疏索引

稠密索引

对于主文件中每一个记录(形成的每一个索引字段值),都有一个索引项和它相对应,指明该记录所在位置。这样的索引称稠密索引。(dense index)

稀疏索引

对于主文件中的部分记录(形成的索引字段值),有索引项和它对应,这样的索引称为非稠密索引或者稀疏索引(sparse index)。

稀疏索引如何定位记录

定位索引字段值为K的记录,需要

首先找相邻的小于K的最大索引字段值所对应的索引项;从该索引项所对应的记录开始顺序进行table的检索

稀疏索引的使用要求:主文件必须是按照对应索引字段属性排序存储

相比稠密索引:空间占用更少,维护任务更轻,但速度更慢

平衡:索引项不指向记录指针,而是指向记录所在的存储块的指针,即每一存储块有一个索引项,而不是每条记录有一索引项——主索引

稠密索引如何定位记录

1.候选键属性的稠密索引 一一对应即可

2.非候选键属性的稠密索引,主文件按照索引字段值排序,对每一个不重复的第一个索引字段值建立索引项,相同索引字段值则在附近寻找;

3.非候选键属性的稠密索引,主文件未按照索引字段值排序,不要求索引项中的索引字段唯一,可以重复出现,以实现对主文件中对应索引字段值的指向;

4.非候选键属性的稠密索引,主文件未按照索引字段值排序,若要求索引中索引字段是唯一的,则可以引入一个中间层,指针桶;该指针桶就是第3种情况。

主索引

主索引概念

通常是对每一个存储块有一个索引项,索引项的总数和存储表所占的存储块数目相同,存储表的每一存储块的第一条记录,又称为锚记录,简称块锚。

主索引的索引字段值为块锚的索引字段值,而指针指向其所在的存储块。

主索引是按索引字段值进行排序的一个有序文件,通常建立在有序主文件的基于主码的排序字段上,即主索引的索引字段与主文件的排序码(主码)有对应关系。

主索引是稀疏索引。

辅助索引

辅助索引定义

是定义在主文件的任一或者多个非排序字段上的辅助存储结构;通常是对某一非排序字段上的不同值有一个索引项,索引字段即是该字段的不同值,而指针则指向包含该纪录的块或者记录本身;

当非排序字段为索引字段时,如该字段值不唯一,则要采用一个类似链表的结构来保存该字段值的所有记录的位置;

辅助索引是稠密索引,检索速度有时候相当高

主索引和辅助索引的区别和联系

一个主文件仅有一个主索引,但可以有多个辅助索引;

主索引通常建立在主码或者排序码上;而辅助索引建立在非排序字段上;

可以利用主索引重新组织主文件数据,但辅助索引不能改变主文件数据;

主索引是稀疏索引,辅助索引是稠密索引。

聚簇索引和非聚簇索引

聚簇索引

是指索引中邻近的记录在主文件中也是临近存储的;

非聚簇索引

是指索引中邻近的记录在主文件中不一定是临近存储的

注意:

如果主文件的某一排序字段不是主码,则该字段上每个记录取值不唯一,此时该字段称为聚簇字段;聚簇索引通常是定义在聚簇字段上;聚簇索引通常是对聚簇字段上的每一个不同值有一个索引项(索引项的总数和主文件中聚簇字段上不同值的数目相同),索引字段即是聚簇字段的不同值,由于有相同聚簇字段值的记录可能存储在若干块中,则索引项的指针指向其中的第一块。一个主文件只能有一个聚簇索引文件,但可以有多个非聚簇索引文件。主索引通常是聚簇索引(但其索引项总数不一定和主文件中聚簇字段上不同值的数目相同,其和主文件存储块数目相同);辅助索引通常是非聚簇索引。主索引/聚簇索引是能够决定记录存储位置的索引;而非聚簇索引则只能用于查询,指出已存储记录的位置。

倒排索引

倒排索引是实现“单词-文档矩阵”的一种具体存储形式,通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。倒排索引主要由两个部分组成:“单词词典”和“倒排文件”。

单词词典(Lexicon):搜索引擎的通常索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向“倒排列表”的指针。

倒排列表(PostingList):倒排列表记载了出现过某个单词的所有文档的文档列表及单词在该文档中出现的位置信息,每条记录称为一个倒排项(Posting)。根据倒排列表,即可获知哪些文档包含某个单词。

倒排文件(Inverted File):所有单词的倒排列表往往顺序地存储在磁盘的某个文件里,这个文件即被称之为倒排文件,倒排文件是存储倒排索引的物理文件。

多级索引

当索引项较多时,可以对索引再建立索引,称为多级索引。

常见的多级索引:B树/B+树索引

多属性索引

索引字段由表的多个属性值组合在一起形成的索引

散列索引

使用散列技术组织的索引

网格索引

使用多索引字段进行交叉联合定位与检索

B+树索引

定义

一种以树形数据结构来组织索引项的多级索引

由于一个存储块是可以存储多个索引项,每个索引项又由指针和索引字段两部分构成。用Ki表示索引字段值,Pi表示指针,指向索引块或者数据块或者数据块中记录。

一块中通常可以存储n-1个索引项和1个指针。

B+树特点

  • 能够自动保持与主文件大小相适应的树的层次
  • 每个索引块的指针利用率都在50%~100%

索引字段值x在Ki-1<=x<Ki的由Pi指向,而Ki<=x<Ki+1的由Pi+1指向。

叶节点和叶子节点的指针分别指向什么

非叶结点指针指向索引块,叶结点指针指向主文件的数据块或数据记录

叶结点的最后一个指针指向下一个数据块

一个索引块实际使用的索引指针个数d,满足(根结点除外)

n/2<=d<=n

根结点至少2个指针被使用

B+树存储约定

索引字段值重复出现于叶结点和非叶结点

指向主文件的指针仅出现于叶结点

所有叶结点即可覆盖所有键值的索引

索引字段值在叶结点中是按顺序排列的

仅叶结点的集合就是主文件完整的索引

到此这篇关于数据库索引知识点整理的文章就介绍到这了,更多相关数据库索引内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Django如何自定义model创建数据库索引的顺序

    首先这是一个先有鸡还是先有蛋的问题,大部分时候数据都来自excel的整理,当数据越来越多,需要分析的点也越来越多的时候,通过excel来管理显然有些吃力了. 这时候就需要将excel导入到数据库中,然而model创建的索引并非是我们编写时候的顺序,特别是当存在 models.ForeignKey 时,我们必须要先创建 ForeignKey的class,最后再创建总表. 为了保证数据库的索引跟excel的索引一致,我们需要对model中的索引字段做一系列的处理(可能这是一个野路子). 首先当然是先

  • oracle数据库关于索引建立及使用的详细介绍

    索引的说明 索引是与表相关的一个可选结构,在逻辑上和物理上都独立于表的数据,索引能优化查询,不能优化DML操作,Oracle自动维护索引,频繁的DML操作反而会引起大量的索引维护. 如果SQL语句仅访问被索引的列,那么数据库只需从索引中读取数据,而不用读取表. 如果该语句同时还要访问除索引列之外的列,那么,数据库会使用rowid来查找表中的行. 通常,为检索表数据,数据库以交替方式先读取索引块,然后读取相应的表块. 索引的目的 主要是减少IO,这是本质,这样才能体现索引的效率. 1大表,返回的行

  • 数据库索引的知识点整理小结,你所需要了解的都在这儿了

    数据库索引,相信大家都不陌生吧. 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息.作为辅助查询的工具,合理的设计索引能很大程度上减轻db的查询压力,db我们都知道,是项目最核心也是最薄弱的地方,如果压力太大很容易产生故障,造成难以预计的影响.所以,不管是日常开发还是面试,索引这一块知识体系都是必须掌握的. 当然,虽说是必须掌握,但索引的知识点很多,很多初学者经常会遗漏,这也是我为什么想写这篇知识点总结的原因,既是给读者的分享,也是给自己一次全面的复习,

  • MySQL数据库优化之索引实现原理与用法分析

    本文实例讲述了MySQL数据库优化之索引实现原理与用法.分享给大家供大家参考,具体如下: 索引 什么是索引 索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录.表里面的记录数量越多,这个操作的代价就越高.如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置.如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍.

  • Mysql数据库高级用法之视图、事务、索引、自连接、用户管理实例分析

    本文实例讲述了Mysql数据库高级用法之视图.事务.索引.自连接.用户管理.分享给大家供大家参考,具体如下: 视图 视图是对若干张基本表的引用,一张虚表,只查询语句执行结果的字段类型和约束,不存储具体的数据(基本表数据发生了改变,视图也会跟着改变),方便操作,特别是查询操作,减少复杂的SQL语句,增强可读性. 1.----创建视图: create view 视图名称(一般以v_开头) as 查询语句; 2.----查看视图: select * from 视图名称; 3.----删除视图: dro

  • 数据库索引知识点整理

    初识索引 索引的概念 索引是定义在存储表的基础上,有助于无需检查所有记录而快速定位所需记录的一种辅助存储结构,由一系列存储在磁盘上的索引项组成,每一索引项又由两部分构成.即索引字段和行指针. 索引字段 由表中某些列通常是一列中的值串接而成.索引中通常存储了索引字段的每一个值. 行指针 指向表中包含索引字段值的记录在磁盘上的存储位置. 存储索引项文件的为索引文件,存储表称为主文件. 索引文件组织方式 (相对照的,主文件组织有堆文件,排序文件,散列文件,聚簇文件等多种方式) 排序索引文件:按索引字段

  • Oracle数据库索引的维护

    正在看的ORACLE教程是:Oracle数据库索引的维护. 本文只讨论Oracle中最常见的索引,即是B-tree索引.本文中涉及的数据库版本是Oracle8i. 一. 查看系统表中的用户索引 在Oracle中,SYSTEM表是安装数据库时自动建立的,它包含数据库的全部数据字典,存储过程.包.函数和触发器的定义以及系统回滚段. 一般来说,应该尽量避免在SYSTEM表中存储非SYSTEM用户的对象.因为这样会带来数据库维护和管理的很多问题.一旦SYSTEM表损坏了,只能重新生成数据库.我们可以用下

  • Vue面试题及Vue知识点整理

    看面试题,只是为了查漏补缺,看看自己那些方面还不懂.切记不要以为背了面试题,就万事大吉了,最好是理解背后的原理,这样面试的时候才能侃侃而谈.不然,稍微有水平的面试官一看就能看出,是否有真才实学还是刚好背中了这道面试题.(都是一些基础的vue面试题,大神不用浪费时间往下看) 一.对于MVVM的理解? MVVM 是 Model-View-ViewModel 的缩写.Model代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑.View 代表UI 组件,它负责将数据模型转化成UI 展现出来

  • Laravel框架基础语法与知识点整理【模板变量、输出、include引入子视图等】

    本文实例讲述了Laravel框架基础语法与知识点整理.分享给大家供大家参考,具体如下: 这篇文章的知识点主要有以下几个点: 模板中输出PHP变量 模板中调用PHP代码 原样输出 模板注释 引入子视图 知识点一:模板中输出PHP变量 首先我们要有一个变量,这个变量我们将他存储于控制器当中. 如下: $name = 'Rarin'; 当然,这个变量肯定要和输出视图放置在一个方法里,然后,我们在Bstp.blade.php(Bstp目录下的)填入 {{$name}} 代码.效果如下: 知识点二:模板中

  • MySql数据库基础知识点总结

    本文实例讲述了MySql数据库基础知识点.分享给大家供大家参考,具体如下: 数据库基本操作 1)创建数据库 基本语法: create database 数据库名称 : 创建应该名称为itcast的数据库.sql语法如下: ``create database ` itcast `:`` 需要主要的是,为了避免用户自定义的名称与系统命令冲突,最好使用反引号(``)包括数据库名称/字段名称和数据表名称 如果创建数据库存在,则程序会报错,为了防止此情况发生,再创建数据库可以使用"if not exist

  • java中Hibernate面试知识点整理

    作为常用的框架之一,Hibernate在面试的时候难免会被问到.好在涉及的都是一些理论方面的知识点,比如概念.原理.使用之类的.我们在面试之前可以针对这方面的题目,做一个充足的准备,即使有些人对hibernate框架的了解并不深入.下面我们就hibernate框架中常见的面试题带来介绍. 1. 为什么要使用 hibernate? (1).对JDBC做了轻量级的封装,简化了数据访问层编码. (2).Hibernate是一个ORM框架,开发者可以使用面向对象的思想操作数据库,使用更加方便. (3)

  • Hibernate中5个核心接口知识点整理

    Hibernate是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库,同时Hibernate作为持久层中间件,它的具体实现对与上层调用是透明的,即上层通过接口来调用Hibernate的具体实现,所以对于入门级别的讨论来说,自然应该先从接口开始了. 1.Configuration核心接口 在Hibernate应用中通过Configuration的实例来指定对象-关系映射文件或通过Configuration动态配

  • MySQL数据库索引的弊端及合理使用

    目录 合理利用索引 1.普通索引的弊端 2.主键索引的陷阱 3.联合索引的矛与盾 4.前缀索引的短小精悍 5.唯一索引的快与慢 6.不要盲目加索引 7.索引失效那些事 索引优化 1.change buffer 2.索引下推 3.刷新邻接页 4.MRR 最后 一个好的索引对数据库系统尤其重要,索引可以说是数据库中的一个大心脏了,如果说一个数据库少了索引,那么数据库本身存在的意义就不大了,和普通的文件没什么两样.今天来说说MySQL索引,从细节和实际业务的角度看看在MySQL中B+树索引好处,以及我

  • 浅谈数据库索引的作用及原理

    数据库索引是为了增加查询速度而对表字段附加的一种标识.很多人机械的理解索引的概念,认为增加索引只有好处没有坏处.其实远不是那样的,这里将其介绍尽量详细些. 首先明白为什么索引会增加速度,DB在执行一条Sql语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合.如果我们对某一字段增加索引,查询时就会先去索引列表中一次定位到特定值的行数,大大减少遍历匹配的行数,所以能明显增加查询的速度.那么在任何时候都应该加索引么?这里有几个反例:1.如果每次都需要取到所有表记录,无论

随机推荐