索引小述

索引原理

B+树索引

查找一个特定值这个树挺好用,但是当你需要查找两个值之间的多个元素时,就会有麻烦了。你的成本将是 O(N),所以引用一种B+树的结构

如图

比方说你找到了 M 个后续节点,树总共有 N 个节点。对指定节点的搜索成本是 log(N),跟上一个树相同。但是当你找到这个节点,你得通过后续节点的连接得到 M 个后续节点,这需要 M 次运算。那么这次搜索只消耗了 M+log(N) 次运算,区别于上一个树所用的 N 次运算。此外,你不需要读取整个树(仅需要读 M+log(N) 个节点),这意味着更少的磁盘访问。如果 M 很小(比如 200 行)并且 N 很大(1,000,000),那结果就是天壤之别了

但是有个问题,树的平衡是需要成本的。

在B+树中,插入和删除操作是 O(log(N)) 复杂度。另外索引的增加对于事物管理器也会有负担

这样,就需要引入另一种索引机制

Hash索引

如果数据都存储在同一个数据库块上,并且将HASH索引作为WHERE子句中的确切匹配,Oracle就可以通过执行一个HASH函数和I/O来访问数据,如图:

HASH索引可能是访问数据库中数据的最快方法,但它也有自身的缺点

它们只适对等比较,如:=   >  <   ,不适合用于范围查询,同时大规模的Hash带来的Hash冲突也会造成性能的下降。

另外Hash需要在集群上,由于集群存在增长的问题,为Hash索引分配空间也是一个问题

时间: 2024-11-07 07:54:35

索引小述的相关文章

学习笔记之小述Linux发行版

一.小述Linux发行版 由于Linux基于OpenOS的原则,任何人都可以获取源其内核源代码,因此也有了众多发行版,其中Linux最主要的三个分支分别是Debian.Slackware.RedHat. 下面分别介绍下三大主流发行版及其衍生版: 1.Debian:Debian Project诞生于1993年8月13日,它的目标是提供一个稳定容错的Linux版本.使用于任何环境,由于系统稳定,多用于服务器.支持Debian的不是某家公司,而是互联网上自发组织起来进行更新和发布的,是最为原汁原味的O

焦点图下面的索引小圆环

从很多焦点轮播图中我们都可以看到下面的显示相应图片的索引小圆环. 淘宝: 魅族: 其他: 当然还可以直接用图片来制作小圆环.

knockout.js $index 做列表索引小技巧

我们都知道,在foreach binding中,使用$index可以得到基于0的索引序号,但在列表显示中,我们更希望这个索引是从1开始的,怎么处理呢? 这里,有个小技巧:使用$index() + 1,如:data-bind="text:$index() + 1" 看到没有,序号是否就是从1开始了?

统计--过滤(筛选)索引的统计信息过期问题测试

基础知识普及: 对于筛选索引,MSDN如是说: 筛选索引是一种经过优化的非聚集索引,尤其适用于涵盖从定义完善的数据子集中选择数据的查询. 筛选索引使用筛选谓词对表中的部分行进行索引. 与全表索引相比,设计良好的筛选索引可以提高查询性能.减少索引维护开销并可降低索引存储开销. 筛选索引与全表索引相比具有以下优点: 提高了查询性能和计划质量 设计良好的筛选索引可以提高查询性能和执行计划质量,因为它比全表非聚集索引小并且具有经过筛选的统计信息.  与全表统计信息相比,经过筛选的统计信息更加准确,因为它

MySQL的btree索引和hash索引&amp;聚集索引

1,BTREE是多叉树,多路径搜索树.有N棵子树的节点它包含N-1个关键字,例如,有3个子树的非叶子节点,那么就有2个关键字,每个关键字不保存数据,只用来存储索引(在索引存储数据时,将索引指向关键字的值也存储进来.最终实现key = &get; value结构).所有的数据最终都要落在叶子节点,所有的叶子节点包括关键字信息以及指向这些关键字的指针,而且叶子节点是根据关键字大小.顺序链接的.所有的叶子节点都必须有个链表指针把数据串起来.所以,所有非叶子节点可以看成索引部分,包括子树中最大值或最小值

Sql Server 索引之唯一索引和筛选索引

唯一索引(UNIQUE  INDEX) 当主键创建时如果不设置为聚集索引,那么就一定是唯一的非聚集索引.实际上,唯一索引,故名思议就是它要求该列上的值是唯一的.唯一索引能够保证索引键中不包含重复的值,从而使表中的每一行从某种方式上具有唯一性. 创建 UNIQUE 约束和创建与约束无关的唯一索引并没有明显的区别.进行数据验证的方式相同,而且对于唯一索引是由约束创建的还是手动创建的,查询优化器并不加以区分. 但是,创建列的 UNIQUE 约束会使索引目标更清晰. Unique Constraints

MYSQL索引失效的各种情形总结

1) 没有查询条件,或者查询条件没有建立索引 2) 在查询条件上没有使用引导列 3) 查询的数量是大表的大部分,应该是30%以上. 4) 索引本身失效 5) 查询条件使用函数在索引列上,或者对索引列进行运算,运算包括(+,-,*,/,! 等) 错误的例子:select * from test where id-1=9; 正确的例子:select * from test where id=10; 6) 对小表查询 7) 提示不使用索引 8) 统计数据不真实 9) CBO计算走索引花费过大的情况.其

oracle 索引失效原因

摘自网络http://blog.chinaunix.net/uid-23622436-id-3184356.html oracle 索引失效的原因 分类: Oracle 1) 没有查询条件,或者查询条件没有建立索引 2) 在查询条件上没有使用引导列 3) 查询的数量是大表的大部分,应该是30%以上. 4) 索引本身失效 5) 查询条件使用函数在索引列上(见12) 6) 对小表查询 7) 提示不使用索引 8) 统计数据不真实 9) CBO计算走索引花费过大的情况.其实也包含了上面的情况,这里指的是

详解索引连接类型

原文:详解索引连接类型 SQL Server有3种连接类型: Hash连接: 合并连接: 嵌套循环连接: 在许多影响小的行集的简单查询中,嵌套循环连接远远优于hash和合并连接.用于查询的连接类型由优化器动态决定. 下面我来先来建立两张简单的表.Province(十条数据)=>PersonTenThousand(1万数据),省份和人的关系,一对多,外键相连: 一.Hash连接 为了理解哈希连接,在这个连接中PersonTenThousand在连接列PId上没有任何索引,先来看看如下查询: 可以看