草庐IT

GBase 8t索引

乐酷yuan 2023-04-19 原文

索引时数据库提高数据查询处理性能的一个非常关键的技术,索引的使用可以对性能产生上百倍甚至上千倍的影响。接下来,会介绍索引的基本原理、概念,并深入学习数据库中所使用的索引结构和存储方式,以及如何管理、维护索引等。

1.索引的基本概念

索引时用来快速查询表记录的一种存储结构,一般使用索引有一下两个方面:

  1. 确定记录的唯一性[唯一性索引,来保证表中记录的唯一性要求]
  2. 提高数据查询的性能
提高表记录查询性能是索引存在的最大优点,在没有索引的情况下,数据库优化器需要采用顺序扫描的方式
扫描全表来查找目标记录。
具体做法是:
	读取所有属于该表的数据页,从表的第一个数据页开始,顺序访问所有包含该表数据页的设备,直到最
后一页为止,返回满足条件的所有行。在扫描小表的记录和需要查询大表中大多数记录的情况下,顺序扫描
是一种不错的选择。小表只占用很少的数据页,对于小表的顺序扫描需要的IO非常小。对于大表上进行全表
扫描的情况,如数据仓库中对系统报表进行查询统计时,需要利用全表数据进行max、min、avg、sum等包
含聚合函数的查询,此时整个表的数据都是查询结果所需要的,这使得顺序扫描优于随机扫描。

性能比较差的时候,如下所述:

	顺序扫描在OLTP系统中性能太低,OLTP系统的特点是一个事务需要处理的记录数非常少,但是表中的
记录量非常大。若在大表中寻找满足一定条件的少量记录(比如 <= 5%),那么顺序扫描需要大量的IO动作,
同时消耗大量的内存,把不需要的数据页填充到内存缓存区中,影响buffer的使用进而影响整个数据库的
性能。因此我们不应该使用顺序扫描档方式去访问随机的或者非顺序存储的数据,这会导致非常明显的性
能损失。在这样的条件下,数据库通过查询索引中记录的行数据所在的物理位置的信息,就可以快速读取
满足条件的少量记录行,而不影响将整个表记录都读取到内存中,因此索引可以有效地减少IO。
总结:索引适用于离散数据扫描的场景

有无索引在表关联中的对比

当量表进行关联连接且其中一张表很大时,索引也是必要存在的。
分析:
	在没有索引的情况下,两张表进行关联时,且套循环的迭代连接过程将严重影响表关联的性能。此时
需要将第一章表中每条满足条件的记录逐一与第二张表进行全表记录匹配,如果第二张表非常大,则全表
扫描的方式将大大影响表关联的效率。在有索引的情况下,优化器可以通过索引找到目标记录,大大减少
匹配次数。当然实际的数据库优化器会对没有索引的表实施创建Hash索引,采用HashJoin方式进行关联。

索引概述:

索引是数据库中的一种结构或者对象,数据库索引与数或者文件柜的索引非常像。它以记录的特征(通常
是一个或多个字段的值)作为输入,能够快速找到该特征的记录,为查询提供快速访问符合条件的数据
行的能力。利用索引进行随机访问时,能够最小化IO,显著提高性能。数据库中的索引是一种动态的数
据结构,它会和表中的数据一起改变。在一个表中可以有多个索引,用来满足不同查询的需要。

什么情况数据库优化器可以使用索引对查询进行加速 ?

	1.使用随机访问方式代替全表数据的顺序访问时;
	2.查询表达式只有索引列时,可以避免读取表中的其他数据行;
	3.在执行GROUP BY和ORDER BY子句时,避免不必要的排序操作(包括创建临时表).通常数据库优
	化器决定是否使用索引,当然我们也可以强迫数据库优化器使用或者避免使用索引。
在执行查询前,如果恰当地在列上建立了索引,则可以节省上千次、上万次,在极限情况下甚至节省
了百万次。但是索引也需要占用空间和资源,来进行额外的处理和索引维护等工作。

2.索引的结构

2.1 B+树

数据库常用的索引会有有二叉搜索树、B树、B+树、Hahs、位图和R树,其中使用最广泛的是B+树。
B+树可以看做成改进的B树,在了解B+树之前,我们来看看B树的索引结构。B树把各个存储快组织成一棵
树,这个树总是保持平衡的,即所有叶子节点总局又相同的深度。B树有是那种节点:根节点、分支节点、
叶子节点。根节点指向多个分支节点,分支节点指向叶子节点,也直接点指向实际的数据行记录【数据
页的地址】

深入学习B树

B树说明:
	B树的阶:节点的最多子节点个数。比如2-3树的阶是3,2-3-4树的阶是4.
	B-树的搜索:从根节点开始,对结点内的关键字(有序)序列进行二分查找,如果命中则结束,否则
	进入查询关键字所属范围的儿子节点;重复;直到所对应的儿子指针为空,或已经是叶子节点。
一棵m阶B树是一棵平衡的m路搜索树,每个存储快(节点)存储m个关键字和m+1个指针。它或者是空树,
或者是满足一下性质的树。
	根节点至少至少包含两个孩子节点,即至少有两个指针被引用,每个指针指向B树的下一层存储快。
	总是保持数据的有序性,每个存储块中的关键字按递增顺序排列

有关GBase 8t索引的更多相关文章

  1. ruby-on-rails - 协会的 Rails 索引 - 2

    我发现自己需要这个。假设cart是一个包含用户列表的模型。defindex_of_itemcart.users.each_with_indexdo|u,i|ifu==current_userreturniendend获取此类关联索引的更简单方法是什么? 最佳答案 indexArray上的方法与您的index_of_item方法相同,例如cart.users.index(current_user)返回数组中第一个对象的索引==给obj。如果未找到匹配项,则返回nil。 关于ruby-on-

  2. ruby - Rails -- :id attribute? 所需的数据库索引 - 2

    因此,当我遵循MichaelHartl的RubyonRails教程时,我注意到在用户表中,我们为:email属性添加了一个唯一索引,以提高find的效率方法,因此它不会逐行搜索。到目前为止,我们一直在根据情况使用find_by_email和find_by_id进行搜索。然而,我们从未为:id属性设置索引。:id是否自动索引,因为它在默认情况下是唯一的并且本质上是顺序的?或者情况并非如此,我应该为:id搜索添加索引吗? 最佳答案 大多数数据库(包括sqlite,这是RoR中的默认数据库)会自动索引主键,对于RailsMigration

  3. ruby - 引用具有指定索引的枚举器值 - 2

    假设我有一个可枚举对象enum,现在我想获取第三个项目。我知道一种通用方法是转换成数组,然后使用索引访问,如:enum.to_a[2]但这种方式会创建一个临时数组,效率可能很低。现在我使用:enum.each_with_index{|v,i|breakvifi==2}但这非常丑陋和多余。执行此操作最有效的方法是什么? 最佳答案 你可以使用take剥离前三个元素,然后剥离last从take给你的数组中获取第三个元素:third=enum.take(3).last如果您根本不想生成任何数组,那么也许:#Ifenumisn'tanEnum

  4. ruby - 将 Logstash 中的时间戳时区转换为输出索引名称 - 2

    在我的场景中,Logstash收到的系统日志行的“时间戳”是UTC,我们在Elasticsearch输出中使用事件“时间戳”:output{elasticsearch{embedded=>falsehost=>localhostport=>9200protocol=>httpcluster=>'elasticsearch'index=>"syslog-%{+YYYY.MM.dd}"}}我的问题是,在UTC午夜,Logstash在外时区(GMT-4=>America/Montreal)结束前将日志发送到不同的索引,并且索引在20小时(晚上8点)之后没有日志,因为“时间戳”是UTC。我们已

  5. ruby - 从特定索引开始迭代数组 - 2

    我想从特定索引开始遍历数组。我该怎么做?myj.eachdo|temp|...end 最佳答案 执行以下操作:your_array[your_index..-1].eachdo|temp|###end 关于ruby-从特定索引开始迭代数组,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/44151758/

  6. ruby - Array of Arrays,根据索引处的数组内容删除一个索引? - 2

    我一直在努力学习如何处理由数组组成的数组。假设我有这个数组:my_array=[['ORANGE',1],['APPLE',2],['PEACH',3]我将如何找到包含'apple'的my_array索引并删除该索引(删除子数组['APPLE',2]因为'apple'包含在该索引的数组中)?谢谢-我非常感谢这里的帮助。 最佳答案 您可以使用Array.select过滤掉项目:>>a=[['ORANGE',1],['APPLE',2],['PEACH',3]]=>[["ORANGE",1],["APPLE",2],["PEACH",3

  7. ruby - 如何使用部分字符串搜索数组并返回索引? - 2

    我想使用部分字符串搜索数组,然后获取找到该字符串的索引。例如:a=["Thisisline1","Wehaveline2here","andfinallyline3","potato"]a.index("potato")#thisreturns3a.index("Wehave")#thisreturnsnil使用a.grep将返回完整的字符串,使用a.any?将返回正确的true/false语句,但都不会返回匹配的索引找到了,或者至少我不知道该怎么做。我正在编写一段代码,该代码读取文件、查找特定header,然后返回该header的索引,以便它可以将其用作future搜索的偏移量。如果

  8. ruby-on-rails - Rails 4 从迁移索引中删除迁移 ID - 2

    如何在rakedb:migrate:status中删除带有“**NOFILE**”的迁移ID列表?例如:StatusMigrationIDMigrationName--------------------------------------------------up20131017204224Createusersup20131218005823**********NOFILE**********up20131218011334**********NOFILE**********我不明白为什么当我自己手动删除它时它仍然保留旧的迁移文件,因为我正在研究迁移的工作原理。这是为了记录吗?但

  9. ruby - 根据子哈希值获取数组索引 - 2

    假设我有这个:[{:id=>34,:votes_count=>3},{:id=>2,:votes_count=>0},]如何根据id获取索引?我想要做的是在搜索id:34时返回0,在搜索id:21/。什么是最有效的方法? 最佳答案 你可以将一个block传递给#index:array.index{|h|h[:id]==34}#=>0 关于ruby-根据子哈希值获取数组索引,我们在StackOverflow上找到一个类似的问题: https://stackove

  10. ruby - 如何使用每个迭代器获取数组索引或迭代次数? - 2

    我正在用ruby​​遍历一个数组。有没有一种简单的方法可以在不返回for循环的情况下获取迭代次数或数组索引? 最佳答案 啊,知道了。each_with_index哇!编辑:糟糕! 关于ruby-如何使用每个迭代器获取数组索引或迭代次数?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/706115/

随机推荐