一.索引原理:

为认识索引工作原理,首先有必要对数据表的基本结构作一次全面的复习。

当一个新表被创建之时,系统将在磁盘中分配一段以8K为单位的连续空间,当字段的值从内存写入磁盘时,就在这一既定空间随机保存,当一个8K用完的时候,SQLS指针会自动分配一个8K的空间。这里,每个8K空间被称为一个数据页(Page),又名页面或数据页面,并分配从0-7的页号,每个文件的第0页记录引导信息,叫文件头(File header);每8个数据页(64K)的组合形成扩展区(Extent),称为扩展。全部数据页的组合形成堆(Heap)。
SQLS规定行不能跨越数据页,所以,每行记录的最大数据量只能为8K。这就是char和varchar这两种字符串类型容量要限制在8K以内的原因,存储超过8K的数据应使用text类型,实际上,text类型的字段值不能直接录入和保存,它只是存储一个指针,指向由若干8K的文本数据页所组成的扩展区,真正的数据正是放在这些数据页中。
页面有空间页面和数据页面之分。
当一个扩展区的8个数据页中既包含了空间页面又包括了数据或索引页面时,称为混合扩展(Mixed Extent),每张表都以混合扩展开始;反之,称为一致扩展(Uniform Extent),专门保存数据及索引信息。
表被创建之时,SQLS在混合扩展中为其分配至少一个数据页面,随着数据量的增长,SQLS可即时在混合扩展中分配出7个页面,当数据超过8个页面时,则从一致扩展中分配数据页面。
空间页面专门负责数据空间的分配和管理,包括:PFS页面(Page free space):记录一个页面是否已分配、位于混合扩展还是一致扩展以及页面上还有多少可用空间等信息;GAM页面(Global allocation map)和SGAM页面(Secodary global allocation map):用来记录空闲的扩展或含有空闲页面的混合扩展的位置。SQLS综合利用这三种类型的页面文件在必要时为数据表创建新空间;

实际上,您可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引:

1.聚集索引

其实,我们的汉语字典的正文本身就是一个聚集索引。比如,我们要查“安”字,就会很自然地翻开字典的前几页,因为“安”的拼音是“an.

字典的正文部分本身就是一个目录,您不需要再去查其他目录来找到您需要找的内容。

我们把这种正文内容本身就是一种按照一定规则排列的目录称为“聚集索引”。

2.非聚集索引

如果您认识某个字,您可以快速地从自动中查到这个字。但您也可能会遇到您不认识的字,不知道它的发音,这时候,您就不能按照刚才的方

法找到您要查的字,而需要去根据“偏旁部首”查到您要找的字,然后根据这个字后的页码直接翻到某页来找到您要找的字。但您结合“部首

目录”和“检字表”而查到的字的排序并不是真正的正文的排序方法,比如您查“张”字,我们可以看到在查部首之后的检字表中“张”的页

码是672页,检字表中“张”的上面是“驰”字,但页码却是63页,“张”的下面是“弩”字,页面是390页。很显然,这些字并不是真正的分

别位于“张”字的上下方,现在您看到的连续的“驰、张、弩”三字实际上就是他们在非聚集索引中的排序,是字典正文中的字在非聚集索引

中的映射。我们可以通过这种方式来找到您所需要的字,但它需要两个过程,先找到目录中的结果,然后再翻到您所需要的页码。

我们把这种目录纯粹是目录,正文纯粹是正文的排序方式称为“非聚集索引”。

通过以上例子,我们可以理解到什么是“聚集索引”和“非聚集索引”。

二。实例分析:

下面我们就来看一下在200万条数据量的情况下各种查询的速度表现(以25万条数据为例说明)

create database index_Test1 --创建测试用的索引数据库
GO
use index_Test1
GO
create table IndexTable1
(
   gid int identity(1,1) primary key,
   data datetime,
   creater varchar(100) not null,
   title varchar(100) not null, 
)

--插入数据

declare @i int
set @i=1
while @i<=2000000
begin
  insert into IndexTable1(data,creater,title) values(DATEADD(day, @i, getdate()),'mfm','这是测试索引的例子')
  set @i=@i+1
end

--默认情况下查询前250000条数据的时间
declare @timediff datetime
select @timediff=getdate()
select top 250000 * from IndexTable1
select datediff(ms,@timediff,GetDate()) as 耗时

--在主键上建立聚集索引,在data上建立非聚集索引(非常慢)
create CLUSTERED index gid_index on IndexTable1(data)

--也可以利用以下方法修改主健为非聚集索引
alter   table   IndexTable1  add   constraint   pk_dr   primary   key   nonclustered(gid)

--删除已存在的索引
drop index IndexTable1.gid_index

经过测试,总结如下:

1.在默认情况下,即以gid为主健时,系统自动生成聚集索引,查询25w数据花了3382ms

2.以gid为主健聚集索引,data建立为非聚集索引时,查询25w数据花了5586ms

3.取消主健取集索引,建立data为取集索引时,查询25w数据花了2274ms

本人机器配置是:本本迅弛双核1.6g,512m内存,独显128m,大家可以按照以上方法去一一测试。

转载于:https://www.cnblogs.com/chuncn/archive/2009/02/27/1399897.html

索引原理及项目中如何使用索引实例分析相关推荐

  1. python默认参数举例_Python中的默认参数实例分析

    本文研究的主要是Python中的默认参数的相关内容,具体如下. 熟悉C++语言的可以知道,C++语言中的默认参数是写在函数声明中的,为语法糖,与函数的调用无关,是在函数调用的时候由编译器补齐参数然后进 ...

  2. java 获取发布后的路径问题_Java中的路径问题实例分析

    Java中的路径问题实例分析 前言:关于Java中得路径问题,网上有很多获取的答案,我这篇文章的目的在于说明获取路径时一些不常见的概念.在实际应用中使用的比较多的就是,当前路径和配置文件的路径(其他文 ...

  3. python中max函数用法_Python中max函数用法实例分析

    Python中max函数用法实例分析 更新时间:2015年07月17日 15:45:09 作者:优雅先生 这篇文章主要介绍了Python中max函数用法,实例分析了Python中max函数的功能与使用 ...

  4. python中property函数_python 邮件表格Python中property函数用法实例分析

    本文实例讲述了Python中property函数用法.分享给大家供大家参考,具体如下: 通常我们在访问和赋值属性的时候,都是在直接和类(实例的)的__dict__打交道,或者跟数据描述符等在打交道.但 ...

  5. 带你了解什么是MySQL数据库(六)索引原理,如何建立与使用索引

    文章目录 前言 索引原理 介绍 查找二叉树.平衡二叉树.B树.B+树 聚集索引与非聚集索引 索引管理 测试索引 正确使用索引 联合索引 索引下推技术 索引优化神器 常见慢查询优化 前言 学习过某一门编 ...

  6. 【MySQL】索引原理(三):联合索引(最左前缀原则),覆盖索引,索引条件下推

    准备工作,下面的演示都是基于user_innodb表: DROP TABLE IF EXISTS `user_innodb`; CREATE TABLE `user_innodb` (`id` big ...

  7. mysql的覆盖索引原理_「Mysql索引原理(七)」覆盖索引

    通常大家都会根据查询的WHERE条件来创建合适的索引,不过这只是索引优化的一个方面.设计优秀的索引应该考虑到整个查询,而不单单是WHERE条件部分.索引确实是一种查找数据的高效方式,但是MySQL也可 ...

  8. mysql使用索引扫描做排序_「Mysql索引原理(八)」使用索引扫描做排序

    MySQL有两种方式可以生成有序的结果:通过排序操作:或者按索引顺序扫描:如果explain出来的type列的值为index,则说明MySQL使用了索引扫描来做排序. 扫描索引本身是很快的,因为只需要 ...

  9. oracle索引使用例子,Oracle中利用函数索引处理数据倾斜案例

    关于B-Tree.Bitmap.函数索引的相关内容请参考另一篇博文: Oracle中B-Tree.Bitmap和函数索引使用案例总结 通常来说,索引选取的数据列最好为分散度高.选择性好.从索引树结构的 ...

最新文章

  1. Exchange Server 2016管理系列课件19.开启和管理存档邮箱
  2. 关于U打包代码必须放到Editor目录下的问题
  3. 科研助力 | 牛津,MIT导师计算机科研项目招生(仅限AI,机器学习,深度学习方向)...
  4. 什么行业需要java_java开发可以从事什么行业
  5. IDA动态调试Android的DEX文件
  6. 关于axios中'$router' of undefined问题
  7. 开源版权 项目 字体
  8. iOS MAC抓包工具charles(青花瓷)配置教程
  9. 互联网晚报 |10/13 | 腾讯地图PC端将停止服务;国际货币基金组织下调全球经济增长预期至2.7%;保时捷菜刀售价1700元...
  10. Python实现简单的用户管理系统
  11. 戴尔豪斯大学计算机科学学费,加拿大研究生申请案例:渥太华大学录取:电子商业科技申请案例【2013】...
  12. text mesh pro html,TextMesh Pro 超链接解析失败
  13. http协议学习(转载,侵删)
  14. 免费杀毒软件卡巴斯基安装
  15. lezhin漫画账号注册登录教程
  16. libnet发包过程
  17. 游戏服务端php,fooking: 分布式游戏网关(php游戏网关, php游戏服务端)
  18. 那些著名的软件都是用什么语言编写的?
  19. 对话《主算法》作者:图灵测试是个坏主意 | AI英雄
  20. uni-app:uni-ui的使用

热门文章

  1. 工作388-jq返回实例
  2. [css] 如何让表格单元格等宽显示
  3. 歌谣--回顾2020 展望2021
  4. 前端学习(2604):增加响应头可以获取数据
  5. 前端学习(2034)vue之电商管理系统电商系统之绘制图表
  6. 前端学习(1991)vue之电商管理系统电商系统之实现商品的分页功能
  7. 前端学习(1968)vue之电商管理系统电商系统之将不同的参数挂载到数据源上
  8. 前端学习(1611):redux使用
  9. spring mvc学习(38):Unknow tag(c:forEach)错误解决办法,jstl.jar包以及standard.jar包下载与导入
  10. 第八期:继美商务部拉黑多家中国公司后,MIT开始审查对华AI合作项目