在前一个创建索引中已经大概说了三部分的影响,基本应该注意哪一些。写完上一篇后我感觉有很多地方没有写清楚,所以这篇就是更深入一些的理解索引到底是怎么和数据表关联,怎么快速查询的。

  先看一下下面的图,图是描述的在一个表上三个字段建了一个索引的情况,图分成三部分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,索引与数据关系,怎么查询的整个过程

数据库索引<二> 补充前篇 (上一篇抽风了,这个补上)的更多相关文章

  1. 数据库索引<二> 补充前篇

    你要准备的软件有: 最新版 Rsync for windows 服务端:cwRsync_Server_2.1.5_Installer.zip 客户端:cwRsync_2.1.5_Installer.z ...

  2. 数据库索引<二> 如何创建索引

    前面一篇说法了索引结构,和几种索引在数据表上的结构,了解了索引可以为查询服务,这篇说一说如何创建索引. >平时可能的创建方式 这个系统中要用到A字段,B字段,C字段做为查询的条件,联接的条件较多 ...

  3. SQL Server调优系列进阶篇(如何维护数据库索引)

    前言 上一篇我们研究了如何利用索引在数据库里面调优,简要的介绍了索引的原理,更重要的分析了如何选择索引以及索引的利弊项,有兴趣的可以点击查看. 本篇延续上一篇的内容,继续分析索引这块,侧重索引项的日常 ...

  4. SQL Server调优系列进阶篇 - 如何维护数据库索引

    前言 上一篇我们研究了如何利用索引在数据库里面调优,简要的介绍了索引的原理,更重要的分析了如何选择索引以及索引的利弊项,有兴趣的可以点击查看. 本篇延续上一篇的内容,继续分析索引这块,侧重索引项的日常 ...

  5. SQL Server 调优系列进阶篇 - 如何维护数据库索引

    前言 上一篇我们研究了如何利用索引在数据库里面调优,简要的介绍了索引的原理,更重要的分析了如何选择索引以及索引的利弊项,有兴趣的可以点击查看. 本篇延续上一篇的内容,继续分析索引这块,侧重索引项的日常 ...

  6. MongoDB索引(一) --- 入门篇:学习使用MongoDB数据库索引

    这个系列文章会分为两篇来写: 第一篇:入门篇,学习使用MongoDB数据库索引 第二篇:进阶篇,研究数据库索引原理--B/B+树的基本原理 1. 准备工作 在学习使用MongoDB数据库索引之前,有一 ...

  7. MySQL数据库索引(上)

    上一篇回顾: 1.数据页由七部分组成,包括File Header(描述页的信息).Page Header(描述数据的信息).Infimum + Supremum(页中的虚拟数据最大值和最小值).Use ...

  8. Python之路【第二十四篇】:数据库索引

    数据库索引 一.索引简介 索引在mysql中也叫做"键",是存储引擎用于快速找到记录的一种数据结构.索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈 ...

  9. mysql进阶(二十七)数据库索引原理

    mysql进阶(二十七)数据库索引原理 前言   本文主要是阐述MySQL索引机制,主要是说明存储引擎Innodb.   第一部分主要从数据结构及算法理论层面讨论MySQL数据库索引的数理基础.    ...

随机推荐

  1. 嵌套结构使用:struc1-struc2-XXX

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  2. So easy Webservice 6.使用EndPoint发布webservice服务

    创建第一个Web服务: @WebService // 添加了此注解,代表是一个WebService public class HelloWorld { // 非 static final privat ...

  3. C# DataGridView控件绑定数据后清空数据

    //1.this.dataGridView1.DataSource = null;//会将DataGridView的列也删掉 //2.this.dataGridView1.Columns.Clear( ...

  4. Domion OA 日记

    我现在使用的是IBM的 Lotus Dimion 8.5 以下内容是个人的浅显了解,在此记录下,已作为后续记录的翻看 第一次接触文档型数据库,确实颠覆了我对数据模型的认知,我之前一直用sql的 文档型 ...

  5. 触发器创建及Navicat中使用

    mysql中的触发器(trigger)使用 Trigger: 示例: mysql,)); Query OK, rows affected (0.03 sec) mysql> CREATE TRI ...

  6. git各种撤销操作

    撤销git add: git reset HEAD+路径 或者git reset --+路径 撤销commit: 1.回退到具体的嘻哈值 git reset --hard     2.回退后仍包含本地 ...

  7. Java JDBC连接数据库 Access连接数据库

    1.加载JDBC驱动程序:  在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),再通过java.lang.Class类的静态方法forName(String  classN ...

  8. Android notifications通知栏的使用

    app发送通知消息到通知栏中的关键代码和点击事件: package com.example.notifications; import android.os.Bundle; import androi ...

  9. JavaWeb学习总结(十二)--事务

    一.事务的介绍 1.1 什么是事务 银行转账!张三转10000块到李四的账户,这其实需要两条SQL语句: 给张三的账户减去10000元: 给李四的账户加上10000元. 如果在第一条SQL语句执行成功 ...

  10. nginx相关优化

    1.配置监控nginx状态信息 vim /usr/locale/nginx/conf/nginx.conf server { listen ; server_name 192.168.1.30; lo ...