数据库索引<二> 补充前篇 (上一篇抽风了,这个补上)
在前一个创建索引中已经大概说了三部分的影响,基本应该注意哪一些。写完上一篇后我感觉有很多地方没有写清楚,所以这篇就是更深入一些的理解索引到底是怎么和数据表关联,怎么快速查询的。
先看一下下面的图,图是描述的在一个表上三个字段建了一个索引的情况,图分成三部分A,B,C。下面慢慢来看这几部分。

A部分,这个是B树的一个缩略图,方便习惯平时的思维。
B部分,这个就是详细的数据排列情况了,举了几个简单的例子,但是大概能看出索引节点里面数据的关系了。这里就像前一篇中想像成group by 后面的列一样,先排哪个,后排列哪个,那么哪些结构可能会用到这个索引呢?下面我分别列出几个查询,看哪些能用到
1)select * from tb where a>10;
2)select * from tb where b>10;
3)select * from tb where c>'h';
4)select * from tb where b>10 and a>10;
5)select * from tb where b>10 and c>'h';
6)select * from tb where a>10 and c>'h';
B树的查询是从根节点进入的,其实也就是看这些条件哪些能从根节点时入,我们这里不考虑索引扫描的情况,其实SQLServer的索引叶之前还有指针,有时也会用到索引扫描,这里我们只考虑索引查找的情况,假设数据比较大,分部均匀。
根节点的区别是从a开始的,其实我图中数据没有举好,其实在上面两个节点之间也可以有 45,200,x这种类型的数据,所以能用到索引的是用到a条件的1),4),6)其中第4)个位置对换是对逻辑没有影响的。
C部分,这个是最重要的一部分,就是图中有色彩的部分,我为什么经常把图画成这样横过来其实就是为了这个很符合我们的习惯。
看图上,我写了列1,列2 ....列n和页1,页2....页n,这个就和我平时查询表的展示一样,一列一列的,只是而是这样包含所有列的1行或多行,如果一行空间足够大,可以一行就是一个页,平时我们用的多数是多行放到一个列里面。接下来就是说一下查询读取数据的整个过程了。
先是经过A部分可以快速(索引提速就在这里)的查询到所要数据的范围。
再通过索引键去找到数据。
最后读取这些页出来(这里要注意读数据最基本的单位是页,就是你只有一行数据,也会读取一页出来)
上面说了步聚,我们重点来看一下第三步。
1)就算你只读取一行数据,也会读取一整页出来。比如下面查询
select top 1 * from tb where a>10;
这个在最后读取是一个页的数据出来,所以这里SQLServer会有优化的空间。
2)就算你只读取一两列少数数据也会读取一整页出来。比如下面查询
select [列1],[列2] from tb where [列1]>10;
这个在最后读取的是在条件范围内的所有页,也就是也读取了列3到列n的数据。所以这里SQLServer会有优化的空间,SQLServer2012在这里也做了优化,可以创建以列为索引的列存储索引(ColumnStore Index),当然这个有她的好处,也有不方便的地方,她不能随时更新删除之类的操作,但是他对静态数据的查询是很有效的,比如一个ip库,里面有ip,地名,公司名,还有其它一些列,在这个表上有很多不同的查询,有查地名,有查公司等,这个用这种列存储过引就很有效果,其实这里的例实很有限,你说地名,公司名基本不会占用太大的空间,大概意思到位就行了吧。
最后是总结了,本文主要内容
1,索引B树(图中A部分)
2,索引B树存储结构(图中B部分,带上数据),索引覆盖(那几个查询例子)
3,索引与数据关系,怎么查询的整个过程
数据库索引<二> 补充前篇 (上一篇抽风了,这个补上)的更多相关文章
- 数据库索引<二> 补充前篇
你要准备的软件有: 最新版 Rsync for windows 服务端:cwRsync_Server_2.1.5_Installer.zip 客户端:cwRsync_2.1.5_Installer.z ...
- 数据库索引<二> 如何创建索引
前面一篇说法了索引结构,和几种索引在数据表上的结构,了解了索引可以为查询服务,这篇说一说如何创建索引. >平时可能的创建方式 这个系统中要用到A字段,B字段,C字段做为查询的条件,联接的条件较多 ...
- SQL Server调优系列进阶篇(如何维护数据库索引)
前言 上一篇我们研究了如何利用索引在数据库里面调优,简要的介绍了索引的原理,更重要的分析了如何选择索引以及索引的利弊项,有兴趣的可以点击查看. 本篇延续上一篇的内容,继续分析索引这块,侧重索引项的日常 ...
- SQL Server调优系列进阶篇 - 如何维护数据库索引
前言 上一篇我们研究了如何利用索引在数据库里面调优,简要的介绍了索引的原理,更重要的分析了如何选择索引以及索引的利弊项,有兴趣的可以点击查看. 本篇延续上一篇的内容,继续分析索引这块,侧重索引项的日常 ...
- SQL Server 调优系列进阶篇 - 如何维护数据库索引
前言 上一篇我们研究了如何利用索引在数据库里面调优,简要的介绍了索引的原理,更重要的分析了如何选择索引以及索引的利弊项,有兴趣的可以点击查看. 本篇延续上一篇的内容,继续分析索引这块,侧重索引项的日常 ...
- MongoDB索引(一) --- 入门篇:学习使用MongoDB数据库索引
这个系列文章会分为两篇来写: 第一篇:入门篇,学习使用MongoDB数据库索引 第二篇:进阶篇,研究数据库索引原理--B/B+树的基本原理 1. 准备工作 在学习使用MongoDB数据库索引之前,有一 ...
- MySQL数据库索引(上)
上一篇回顾: 1.数据页由七部分组成,包括File Header(描述页的信息).Page Header(描述数据的信息).Infimum + Supremum(页中的虚拟数据最大值和最小值).Use ...
- Python之路【第二十四篇】:数据库索引
数据库索引 一.索引简介 索引在mysql中也叫做"键",是存储引擎用于快速找到记录的一种数据结构.索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈 ...
- mysql进阶(二十七)数据库索引原理
mysql进阶(二十七)数据库索引原理 前言 本文主要是阐述MySQL索引机制,主要是说明存储引擎Innodb. 第一部分主要从数据结构及算法理论层面讨论MySQL数据库索引的数理基础. ...
随机推荐
- hdu 1800 (map)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1800 Flying to the Mars Time Limit: 5000/1000 MS (Java/ ...
- 7.mybatis一对多关联查询
和第5节一对一查询类似,但是不同的是,一对一使用的是association,而一对多使用collection. 实例: 1个班级Class,对应1个老师Teacher,对应多个学生Student 1. ...
- Linux基础01 学会使用命令帮助
Linux基础01 学会使用命令帮助 概述 在linux终端,面对命令不知道怎么用,或不记得命令的拼写及参数时,我们需要求助于系统的帮助文档:linux系统内置的帮助文档很详细,通常能解决我们的问题, ...
- 委托、匿名方法、Lambda表达式的演进
摘自:"http://www.cnblogs.com/eagle1986/archive/2012/01/19/2327358.html 假设给我们一个泛型对象List<T>,T ...
- Java I/O 文件加锁,压缩
文件加锁: 文件加锁机制允许我们同步访问某个作为共享资源的文件. public class Test { public static void main(String[] args) throws I ...
- poj1113Wall(凸包)
链接 顺便整理出来一份自己看着比较顺眼的模板 #include <iostream> #include<cstdio> #include<cstring> #inc ...
- Monkey学习(1)环境搭建
环境搭建: Monkey程序由Android系统自带,需要配置J2SE平台的JDK,还需要配置Android平台的SDK. 1)下载和配置JDK 下载与安装JDK过程省略... 配置JDK环境变量,我 ...
- JavaWeb学习总结(三)—Servlet
1. 什么是Servlet * Servlet是JavaWeb三大组件之一(Servlet.Filter.Listener) ,Servlet是用来处理客户端请求的动态资源,按照一种约定俗成的称呼习惯 ...
- 【Todo】Java新技术学习笔记-from某技术分析
看到这篇文章:http://mt.sohu.com/20160806/n462923089.shtml <十余年技术大牛告诉你,这些Java新技术不可错过> 虽然讲的比较泛,但是里面提到的 ...
- Android 数据库升级解决方案
转自:http://blog.csdn.net/leehong2005/article/details/9128501 请考虑如下情况: 在数据库升级时,不同版本的数据库,他们定义的表结构完全可能是不 ...