精华内容
下载资源
问答
  • 索引存储结构

    千次阅读 2019-07-26 20:13:23
    四种数据存储结构---顺序存储 链接存储 索引存储 散列存储 转自:https://www.cnblogs.com/fengty90/p/3768826.html 存储结构分四类:顺序存储、链接存储、索引存储 和 散列存储。 顺序结构和链接结构适用在内存...

    四种数据存储结构---顺序存储 链接存储 索引存储 散列存储

    转自:https://www.cnblogs.com/fengty90/p/3768826.html

    存储结构分四类:顺序存储、链接存储、索引存储 和 散列存储

    顺序结构和链接结构适用在内存结构中。

    索引结构和散列结构适用在外存与内存交互结构。

     

    顺序存储:在计算机中用一组地址连续的存储单元依次存储线性表的各个数据元素,称作线性表的顺序存储结构。

    特点:

    1、随机存取表中元素。

    2、插入和删除操作需要移动元素。

     

    链接存储:在计算机中用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。它不要求逻辑上相邻的元素在物理位置上也相邻.因此它没有顺序存储结构所具有的弱点,但也同时失去了顺序表可随机存取的优点。

    特点:

    1、比顺序存储结构的存储密度小 (每个节点都由数据域和指针域组成,所以相同空间内假设全存满的话顺序比链式存储更多)。
    2、逻辑上相邻的节点物理上不必相邻。
    3、插入、删除灵活 (不必移动节点,只要改变节点中的指针)。
    4、查找结点时链式存储要比顺序存储慢。
    5、每个结点是由数据域和指针域组成。

     

    索引存储:除建立存储结点信息外,还建立附加的索引表来标识结点的地址。索引表由若干索引项组成。

    特点:

    索引存储结构是用结点的索引号来确定结点存储地址,其优点是检索速度快,缺点是增加了附加的索引表,会占用较多的存储空间。

     

    散列存储:散列存储,又称hash存储,是一种力图将数据元素的存储位置与关键码之间建立确定对应关系的查找技术。

    散列法存储的基本思想是:由节点的关键码值决定节点的存储地址。散列技术除了可以用于查找外,还可以用于存储。

    特点:

    散列是数组存储方式的一种发展,相比数组,散列的数据访问速度要高于数组,因为可以依据存储数据的部分内容找到数据在数组中的存储位置,进而能够快速实现数据的访问,理想的散列访问速度是非常迅速的,而不像在数组中的遍历过程,采用存储数组中内容的部分元素作为映射函数的输入,映射函数的输出就是存储数据的位置,这样的访问速度就省去了遍历数组的实现,因此时间复杂度可以认为为O(1),而数组遍历的时间复杂度为O(n)。

    展开全文
  • 数据库索引存储结构

    千次阅读 2018-11-08 17:16:08
    数据库索引存储结构 主键索引(PRIMAY KEY):  一个表中只能有一个主键,创建主键自动创建主键索引,该索引是唯一索引,其主键列的数据值不重复。建议使用INT型的自动增长主键,这样索引效率最高。 ...
    数据库索引存储结构

    主键索引(PRIMAY KEY):

           一个表中只能有一个主键,创建主键自动创建主键索引,该索引是唯一索引,其主键列的数据值不重复。建议使用INT型的自动增长主键,这样索引效率最高。

    唯一索引(UNIQUE):

           不允许索引列的值相同。系统在创建该索引时检查是否有重复的键值,并在每次使用INSERT或UPDATE语句添加数据时进行检查。索引结果再根据主键索引查询数据。

    复合索引(INDEX):

           多个列建立索引,复合索引在数据库操作期间所需的开销更小,可以代替多个单一索引;第一个字段作为条件时才能保证系统使用该索引。建议不超过2个字段的复合索引。

     

    B-Tree的存储结构(例如100条数据):

           在B-Tree中按key检索数据的算法非常直观:首先从根节点进行二分查找,如果找到则返回对应节点的data,否则对相应区间的指针指向的节点递归进行查找,直到找到节点或找到null指针,前者查找成功,后者查找失败。每个域的大小都相同。

     

     

    B+Tree的存储结构(例如100条数据):

           

           在B+Tree中key检索数据算法如同目录:首先从根节点进行二分查找,从左(小)边到右(大)匹配,找到key匹配成功的索引值,根据索引值对应的节点地址,进入节点地址key继续进行匹配,直到进入叶节点,再根据key获取数据。

           在B+Tree的每个叶子节点增加一个指向相邻叶子节点的指针,就形成了带有顺序访问指针的B+Tree。做这个优化的目的是为了提高区间访问的性能。

           注意:每个索引的最小值,也就是子索引的最小值,依次类推,最后的子索引的最小值,也就是该数据页的key索引的最小值。最小值都是靠最左边排列。都是节点开始的第一个值。

           注意:叶节点的数据页存有邻近的数据页节点地址,可以通过数据页的节点直接进入邻近数据页,查询需要的主键索引值。 

    索引性能影响:

    • 插入:按顺序插入在尾部,对索引影响微乎其微,索引不用重新排列顺序,只需要添加顺序的记录即可。如果是中间插入,则影响索引顺序,索引需要重写排列顺序,导致性能下降。
    • 删除:尾部删除,对索引影响甚微,索引不用重新排列顺序,只要去除顺序尾部的记录即可。如果中间删除,则影响索引顺序,索引需要重写排列顺序。导致性能下降。
    • 更新:更新字段不包含索引列,性能不会降低。如果更新索引列,索引目录表将重写排列索引顺序,导致性能下降。

     

    索引规则:

    建立索引规则:

    • 数据量超过300的,经常与其他表进行连接的表,在连接字段上应该建立索引;表的主键、外键必须有索引;经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
    • 索引应该建在选择性高的字段类型的小字段上,比如INT类型字段;
    • 尽量不要对数据库中某个含有大量重复的值的字段建立索引。

    复合索引规则:

    • 复合索引的建立需要进行仔细分析,尽量考虑用单字段索引代替;如果需要复合索引,正确选择复合索引中的主列字段,一般是选择性高的字段类型的小字段上;
    • 复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;
    • 如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;
    • 如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;复合索引最好只使用2个字段,索引本身也有I/O、内存、存储开销。复合索引字段越少越好。
    • 如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;

    索引操作影响:

    • 频繁进行数据操作的表,不要建立太多的索引;删除无用的索引,避免对执行计划造成负面影响;
    • 表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。另外,过多的复合索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会降低数据增加删除时的性能,特别是对频繁更新的表来说,负面影响更大。
    展开全文
  • 主要介绍了详解SQL Server表和索引存储结构,有助于大家对SQL存储方式有深入的理解,参考学习下吧。
  • 索引存储结构 索引存储结构=数据表+索引表 索引表(index blocked table)中的每一项称为索引项,索引项的一般形式:(关键字,地址) 举个例子: 分块查找的基本思想 分块查找又称分块索引查找(index blocked search)是...

    索引存储结构
    索引存储结构=数据表+索引表
    索引表(index blocked table)中的每一项称为索引项,索引项的一般形式:(关键字,地址)
    举个例子:
    在这里插入图片描述
    分块查找的基本思想
    分块查找又称分块索引查找(index blocked search)是一种介于顺序查找和二分查找之间的查找方法。其基本思想是:
    (1)将数据表str[0…n-1]均分为b块,前b-1块中记录个数为s=n/b,最后一块即第b块的记录数小于等于s;
    (2)每一块中的关键字不一定有序,但前一块中的最大关键字必须小于后一块中的最小关键字,即要求表是“分块有序”的;
    (3)抽取各块中的最大关键字及其起始位置构成一个索引表IDX[0…b-1],即IDX[i](0≤i≤b-1)中存放着第i块的最大关键字及该块在表R中的起始位置。由于表R是分块有序的,所以索引表是一个递增有序表。
    举个例子:设有一个线性表,其中包含25个记录,其关键字序列为:8,14,6,9,10,22,34,18,19,31,40,38,54,66, 46,71,78,68,80,85, 100, 4,88,96,87。假设将25个记录分为5块,每块中有5个记录,该线性表的索引存储结构如下图所示。
    在这里插入图片描述
    分块查找的算法基本上是顺序查找和二分查找的结合体。读者体会一下下面代码:

    #include <stdio.h>
    #define Max 30//改 
    #define KeyType int //改 
    #define InfoType char//改 
    typedef struct 
    {  
       KeyType key;        //关键字的数据类型
       InfoType data;       //其他数据
    }NodeType;
    typedef NodeType SeqList[Max]; 
    typedef struct
    {
       KeyType key;     
       int link;      //指向分块的起始下标
    }IdxType;
    typedef IdxType Idx[Max/5];   //索引表类型
    int IndexSearch(Idx I,int m,SeqList str,int n,KeyType e)
    {
       int low=0,high=m-1,mid,i,count1=0,count2=0;//1索引表中比较次数,2顺序表对应块中比较次数
       int num=n/m;     //num为每块的记录个数
       while(low<=high) //在索引表中进行二分查找
       {
          mid=(low+high)/2;
          printf("  第%d次比较:在<[%d]%d,[%d]%d>中比较元素[%d]%d\n",++count1,low,I[low].key,high,I[high].key,mid,I[mid].key);
          if(I[mid].key>=e) high=mid-1;
          else low=mid+1;  
       }
       if(low<m)
       {
          printf("比较%d次,在第%d块中查找元素%d\n",count1,low,e);
          i=I[low].link;
          printf("在分块中顺序查找:");
          while(i<I[low].link+num&&str[i].key!=e)
          {
             count2++;
             printf("%3d",str[i].key);
             i++;
           }
           printf("%3d",str[i].key);   
           printf("\n比较%d次,在顺序表中查找元素%d\n",count2+1,e);
           if(i<=I[low].link+num-1) return i;
           else return -1;
         }
    return -1;
    }
    

    分块查找的查找长度不仅和表的长度有关,而且和子表的个数有关。其时间复杂度介于两者之间,一般比顺序查找快,比折半查找慢。分块查找适用于搜索引擎、系统维护等方面。

    展开全文
  • 【mysql】mysql索引存储结构和特点

    万次阅读 2019-08-22 09:14:40
    MySQL索引存储结构和特点 一 理解索引的特性 二 索引的各种存储结构及其优缺点 (一)二叉树 ​(二)红黑树 (三)Hash (四)B-Tree (五) B+Tree(MySQL索引的真正存储结构) 三. 联合索引底层存储结构 ...

    MySQL索引存储结构和特点

    一 理解索引的特性

    二 索引的各种存储结构及其优缺点

    (一) 二叉树

    ​(二) 红黑树

    (三) Hash

    (四) B-Tree

    (五) B+Tree(MySQL索引的真正存储结构)

    三. 联合索引底层存储结构


    MySQL索引存储结构和特点

    一 理解索引的特性

    索引是帮助MySQL高效获取数据的排好序的数据结构
    索引存储在文件里

    二 索引的各种存储结构及其优缺点

    在开始讲这一小节之前,我们先来看一下在数据库没有加索引的情况下,SQL中的where字句是如何查找目标记录的。

    我们先看下左边表格第二列Col2列的数据时如何查找的,如果我们希望查找where Col2 = 22的记录,我们在没加索引的情况下是按顺序从第一条记录查找,由此可知需要查找5次才能找到;

    如果对Col2字段加上索引后,我们假设使用最简单的二叉树作为索引存储方式,再次查找where Col2 = 22的记录这次只需要查找2次就能找到目标记录,效率提高十分明显。


    (一) 二叉树

    1. 优点:

    二叉树是一种比顺序结构更加高效地查找目标元素的结构,它可以从第一个父节点开始跟目标元素值比较,如果相等则返回当前节点,如果目标元素值小于当前节点,则移动到左侧子节点进行比较,大于的情况则移动到右侧子节点进行比较,反复进行操作最终移动到目标元素节点位置。


    2. 缺点:

    在大部分情况下,我们设计索引时都会在表中提供一个自增整形字段作为建立索引的列,在这种场景下使用二叉树的结构会导致我们的索引总是添加到右侧,在查找记录时跟没加索引的情况是一样的,如下图所示:


    (二) 红黑树

    1. 优点:

    红黑树也叫平衡二叉树,它不仅继承了二叉树的优点,而且解决了上面二叉树遇到的自增整形索引的问题,从下面的动态图中可以看出红黑树会左旋、右旋对结构进行调整,始终保证左子节点数 < 父节点数 < 右子节点数的规则。


    2. 缺点:

    在数据量大的时候,深度也很大。从图中可以看出每个父节点只能存在两个子节点,如果我们有很多数据,那么树的深度依然会很大,可能就会超过十几二十层以上,对我们的磁盘寻址不利,依然会花费很多时间查找。

    (三) Hash

    1. 优点:

    对数据进行Hash(散列)运算,主流的Hash算法有MD5、SHA256等等,然后将哈希结果作为文件指针可以从索引文件中获得数据的文件指针,再到数据文件中获取到数据,按照这样的设计,我们在查找where Col2 = 22的记录时只需要对22做哈希运算得到该索引所对应那行数据的文件指针,从而在MySQL的数据文件中定位到目标记录,查询效率非常高。

    2. 缺点:

    无法解决范围查询(Range)的场景,比如 select count(id) from sus_user where id >10;因此Hash这种索引结构只能针对字段名=目标值的场景使用。不适合模糊查询(like)的场景。

    (四) B-Tree

    既然红黑树存在缺点,那么我们可以在红黑树的基础上构思一种新的储存结构。解决的思路也很简单,既然觉得树的深度太长,就只需要适当地增加每个树节点能存储的数据个数即可,但是数据个数也必须要设定一个合理的阈值,不然一个节点数据个数过多会产生多余的消耗。

    按照这样的思路,我们先来了解下关于B-Tree的一些知识点:

    • 度(Degree)-节点的数据存储个数,每个树节点中数据个数大于 15/16*Degree(未验证) 时会自动分裂,调整结构
    • 叶节点具有相同的深度,左子树跟右子树的深度一致
    • 叶节点的指针为空
    • 节点中的数据key从左到右递增排列

    1. 树节点结构:

    在这里需要说明下的是,BTree的结构里每个节点包含了索引值和表记录的信息,我们可以按照Map集合这样理解:key=索引,value=表记录,如下图所示:


    2. 优点:

    BTree的结构可以弥补红黑树的缺点,解决数据量过大时整棵树的深度过长的问题。相同数量的数据只需要更少的层,相同深度的树可以存储更多的数据,查找的效率自然会更高。


    3. 缺点:

    从上面得知,在查询单条数据是非常快的。但如果范围查的话,BTree结构每次都要从根节点查询一遍,效率会有所降低,因此在实际应用中采用的是另一种BTree的变种B+Tree(B+树)。

    (五) B+Tree(MySQL索引的真正存储结构)

    在介绍B+Tree之前,我们先来看下面两个问题:

    1. 为什么要对BTree继续做优化?

    要解答这个疑问需要先了解BTree每个节点结构(上面已经说明)和MySQL数据库它是如何读取索引数据的,索引和表数据在不使用的时候是存储在文件中的,也就是磁盘,当我们执行查询操作时会DBMS(数据库管理系统)首先会先从内存中查找,如果找到直接使用,如果找不到则从磁盘文件中读取;操作系统储存数据的最小单位是页(page),一页假设是4K大小(由操作系统决定),对内存和磁盘读取数据是按一页的整数倍读取的。


    这里我们假设数据库一次IO操作就读取1页4K的数据,再假设图中圈起来的元素就是一个大节点,内含多个小节点的索引和数据,其大小是10MB,那么我们要从磁盘中读取完整个大节点需要进行 10M / 4K = 2500次IO操作,这样就可以看出如果大节点数据总量越大,需要执行的IO操作越多,花费的时间也越长,因此为了提高性能,数据库会建议我们一个大节点只存储一页4K大小的数据,这里的数据包含了索引和表记录,另外我们还能计算出树的度Degree应该设置成多大才合理:

    Degree = 内存页大小(4K) / 单个索引值字节大小;

    进一步分析,索引值的大小相对于整条记录的大小是很小的,如果我们需要查找的数据刚好是在最后,那么前面遍历过的节点中存储的记录数据是不是对我们来说是没用的,它会占用比索引大得多的空间,导致我们一个大节点里能遍历的索引数量大大减少,需要向下继续遍历的几率就更大,花费更多时间查找,那么有没有办法可以优化呢?看下一个问题。

    2. 相对于BTree,B+Tree做了哪些优化?

    B+Tree存储结构,只有叶子节点存储数据
    新的B+树结构没有在所有的节点里存储记录数据,而是只在最下层的叶子节点存储,上层的所有非叶子节点只存放索引信息,这样的结构可以让单个节点存放下更多索引值,增大度Degree的值,提高命中目标记录的几率。

    这种结构会在上层非叶子节点存储一部分冗余数据,但是这样的缺点都是可以容忍的,因为冗余的都是索引数据,不会对内存造成大的负担。


    每个叶子节点都指向下一个叶子节点


    这点优化有什么用呢?我们直接看下面的B+Tree结构,如果我们进行范围查找where id > 4的记录,我们只需要先找到id = 4的记录后自然就能通过叶子节点间的双向指针方便地查询出大于4的所有记录。

    三. 联合索引底层存储结构

    单列索引其实也可以看做联合索引,索引列为1的联合索引,从下图就可以看出联合索引的底层存储跟单列索引时类似的,区别在于联合索引是每个树节点中包含多个索引值,在通过索引查找记录时,会先将联合索引中第一个索引列与节点中第一个索引值进行匹配,匹配成功接着匹配第二个索引列和索引值,直到联合索引的所有索引列都匹配完;如果过程中出现某一个索引列与节点相应位置的索引值不匹配的情况,则无需再匹配节点中剩余索引列,前往下一个节点。

    展开全文
  • 关于串的索引结构,看来很多网站发觉都是一些简单描述,华而不实,看完马春江老师编的《数据结构》,我重新整理了《数据结构之-串的索引存储》,和大家分享。 感谢马春江老师以及罗浩、张顺、王帅林同学的帮助。
  • Lucene索引存储结构

    2020-04-29 17:41:30
    索引文档的总体结构 索引(index):Lucene的索引由许多个文件组成,这些文件放在同一个目录下 段(segment):一个Lucene的索引由多个段组成,段与段之间是独立的。添加新的文档时可以生成新的段,达到阈值(段...
  • MySQL索引存储结构(5种)

    千次阅读 2019-10-10 13:22:28
    MySQL数据库索引存储结构一般有以下几种。 二叉树 红黑树 HASH B-Tree B+Tree(现在常用) 首先我们要了解的是:索引文件是存储在磁盘中的,cpu到磁盘拿取数据一般经过两步:寻道时间(磁头左右移动,速度慢,...
  • 一种高效的倒排索引存储结构,很好的文章,有兴趣的可下载看看
  • - 单链表 / 链式存储结构 链表不限制数据的物理存储状态,物理位置是随机的。 链表的构成: - 头指针:永远指向链表第一个节点的位置,用于指出链表的位置,便于找到链表。 ...不 存任何数据的空节点,...索引存储
  • 建立带链的结构体数组,可以进行关键字索引
  • 文章目录MyIsam主键索引...此处可以看到,user.myi文件中除了存储了主键索引的树装结构外,还存储了我们的另一个索引NAME的索引结构,查找时根据name找到在磁盘中的位置后再去user.myd中找到相应的数据。 结论:在MyI
  • 咨询方法-一种基于多个相关字段组合索引存储结构及建立、查询与维护方法.zip
  • 在UNIX的文件系统中,文件的物理存储结构是以索引方式来组织的。如果将存储结构改为串联方式,即在每个数据块的末尾加上一个指向下一个数据块的指针,则文件系统应做哪些修改?
  • mysql存储引擎&索引存储结构

    千次阅读 2013-10-25 22:35:23
     存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)。...
  • 索引_存储结构

    2020-07-07 23:45:23
    ​​​​不同数据库使用的索引存储结构 聚簇索引 和 非聚簇索引 MongoDB 和Mysql 使用的索引 的 存储结构 B-Tree 和 B+Tree相关介绍 MySql 采用的是 B+Tree(真正的data都存放在最底层的叶子节点上)的存储...
  • mysql索引索引存储结构

    千次阅读 2020-06-22 17:03:20
    文章目录什么是索引索引存储结构如果使用有序数组如果使用单链表如果使用二分查找树(Binary Search Tree)平衡二叉树(AVL树)多路平衡查找树(B Trees)加强版多路平衡树(B+ Trees)简单了解HASH索引 ...
  • 索引存储结构

    2015-03-11 12:13:00
    下面是本人画的一张关于数据页和索引存储结构图 此图中,最上部分是数据页的存储结构。 下半部分是表中有索引,这里就出现了B-Tree结构,索引的根级会引用索引的下一级,直到索引的最后一级,这一级引用的对象是...
  • 索引数据结构: 4.1. MyISAM索引实现: 4.2. InnoDB 索引实现: 1. 存储引擎:  存储引擎是不同数据文件在磁盘上的不同组织形式 MySQL 5.5 之前,MyISAM 引擎是 MySQL 的默认存储引擎 MySQL 5.5 之后,MySQL ...
  • 索引是帮助MySQL高效获取数据的排好序的数据结构索引数据结构 :二叉树、 红黑树、 Hash表、 B-Tree。 索引的目的是为了减小查询时间,提高查询效率。怎么减小查询时间呢?这就需要我们减少内存读取磁盘的...
  • 索引存储结构 索引是在存储引擎中实现的,也就是说不同的存储引擎,会使用不同的索引 MyISAM和InnoDB存储引擎:只支持B+ TREE索引, 也就是说默认使用BTREE,不能够更换 MEMORY/HEAP存储引擎:支持...
  • 我们mysql底层的索引存储数据结构是按照B+树方式来存储的,也是从B树结构演变而来。 我们知道索引就是类似我们的书本的目录页,存储要找的内容所在的页数。 B树的结构: 叶节点具有相同的深度,叶节点的指针为空 ...
  • 存储结构分四类:顺序存储、链接存储、索引存储 和 散列存储。 顺序结构和链接结构适用在内存结构中。 顺序表每个单元都是按物理顺序排列的,如果你想访问那个单元你可以根据提供的指针等直接访问到需要的东西,但是...
  • 索引存储结构与方式: B树索引在数据库中的实际存储方式。
  • 存储结构分四类:顺序存储、链接存储、索引存储和散列存储。
  • 数据结构 字符串索引存储作业 有关串的插、删、改

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 633,691
精华内容 253,476
关键字:

索引存储结构