网页设计与制作ppt课件,宁波seo搜索引擎优化公司,2008系统怎么做网站,河东做网站的公司索引是什么#xff1f;索引是提高查询性能的一个重要工具#xff0c;索引就是把查询语句所需要的少量数据添加到索引分页中#xff0c;这样访问数据时只要访问少数索引的分页就可以。但是索引对于提高查询性能也不是万能的#xff0c;也不是建立越多的索引就越好。索引建少… 索引是什么索引是提高查询性能的一个重要工具索引就是把查询语句所需要的少量数据添加到索引分页中这样访问数据时只要访问少数索引的分页就可以。但是索引对于提高查询性能也不是万能的也不是建立越多的索引就越好。索引建少了用WHERE子句找数据效率低不利于查找数据。索引建多了不利于新增、修改和删除等操作因为做这些操作时SQL SERVER除了要更新数据表本身还要连带地立即更新所有的相关索引而且过多的索引也会浪费硬盘空间。因此要建得恰到好处这就需要经验了。 一索引的基本目的 索引的基本目的是在大量数据中找寻少量数据。你可以想像一下若一本书有700页就像数据表有700个数据页而索引却有600个索引页你会想用索引来查询书籍的内容吗 索引字段的值重复性越低越好假设书籍中如“的”“了”这些在文章中重复性极高的字每页都有一大堆你会先翻索引页某个位置有“的”翻回该页读取了“的”之后再索引看下一个“的”结果是在先前同一页的不同位置又翻回书籍原页查看下一个“的”。 那么怎么理解索引是从大量数据中寻找少量数据呢下面我们举个例子来说明。 如果一个数据表的记录平均长度为400字节则100万条记录需要5万个数据页其计算公式如下 1000000/8060/40050000 如果该数据表建立聚集索引键值为4个字节长度而ID的数据长度为13个字节因此索引结构每条记录为20个字节。 4聚集索引键值13ID键值3管理信息20 以ID字段所建立的索引100%填充率则总分页数约为2482页其计算方式如下 1000000/(8060/20) 即使是使用80%的填充率来计算也只有3106页。其计算方式如下 1000000/((8060*0.8)/20) 从上面可以看出如果是第一种情况则索引页只占到总数据页的5% 2482/500000.04964 即使考虑取每页只填充80%的索引数据第二种情况索引页也只是占总数据页的6% 3106/500000.06212 再说如果查询条件中的字段建立索引则由于索引键值数据都是以B-Tree有顺序的摆放所以可采用二分查找找数据。也就是2的N次方大于记录数就可以找到该条数据。而2的20次方大于100万因此最多找寻20次就可以找到该条记录。由于比较次数少数据结构也小节省访问硬盘与内在的资源索引将大幅提升找寻数据的效率。SQL SERVER为提高访问与查找对比的效率用来作索引的数据域键值愈小愈好也就是要让分页尽量存更多的键值记录。 注 如果未使用 UNIQUE 属性创建聚集索引数据库引擎将向表自动添加一个 4 字节的 uniqueifier 列。必要时数据库引擎将向行自动添加一个 uniqueifier 值以使每个键唯一。此列和列值供内部使用用户不能查看或访问。 二什么是索引 在 SQL Server 中索引是按 B 树结构进行组织的。如下图。 您也可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引聚集索引clustered index也称聚类索引、簇集索引和非聚集索引nonclustered index也称非聚类索引、非簇集索引。下面举例来说明一下聚集索引和非聚集索引的区别 其实新华字典的正文本身就是一个聚集索引。比如我们要查“按”字就会很自然地翻开字典的前几页因为“按”的拼音是“an”而按照拼音排序的新华字典是以英文字母“a”开头并以“z”结尾的那么“按”字就自然地排在字典的前部。如果您翻完了所有以“a”开头的部分仍然找不到这个字那么就说明新华字典中没有这个字同样的如果查“招”字那也会将新华字典翻到最后部分因为“招”的拼音是“zhao”。也就是说新华字典的正文部分本身就是一个目录您不需要再去查其他目录来找到您需要找的内容。我们把这种正文内容本身就是一种按照一定规则排列的目录称为“聚集索引”。 如果您碰到一个不认识的字不知道它的发音这时候您就不能按照刚才的方法找到您要查的字而需要去根据“偏旁部首”查到您要找的字然后根据这个字后的页码直接翻到某页来找到您要找的字。但您结合“部首目录”和“检字表”而查到的字的排序并不是真正的正文的排序方法比如您查“张”字我们可以看到在查部首之后的检字表中“张”的页码是672页检字表中“张”的上面是“驰”字但页码却是63 页“张”的下面是“弩”字页面是390页。很显然这些字并不是真正的分别位于“张”字的上下方现在您看到的连续的“驰、张、弩”三字实际上就是他们在非聚集索引中的排序是字典正文中的字在非聚集索引中的映射。我们可以通过这种方式来找到您所需要的字但它需要两个过程先找到目录中的结果然后 再翻到您所需要的页码。我们把这种目录纯粹是目录正文纯粹是正文的排序方式称为“非聚集索引”。 通过以上例子我们可以理解到什么是“聚集索引”和“非聚集索引”。进一步引申一下。 聚集索引 聚集索引指的是数据表本身就是索引的一部分就是指数据表本身就是聚集索引的子叶层整个数据表的摆放顺序是按照你选定的键值由小到大排序SQL SERVER 2000 之后的版本可指定数据由大到小排序。 整个数据表按照键值字段由小到大排序再搭配由键值字段加上指针的上层索引结构也就是根节点和非子叶层级形成整个聚集索引。因为数据表内实际摆放数据的方式只能遵循一种顺序所以一个数据表只能有一个聚集索引。在指定聚集索引时数据域本身并不需要唯一或指定为唯一的聚集索引SQL SERVER内部会自动为重复的键值建立4个字节的唯一标识。 如果你的数据表有一列常常用来排序另一列常常用来 范围查询还有一列重复性非常高则该用哪一列来做聚集索引。正确答案是依据哪个查询最重要最常被用户执行。例如你的老板一小时内多次执行某个查询当然比一个月执行一两次的查询来得重要。 表堆创建聚集索引或删除和重新创建现有聚集索引时要求数据库具有额外的可用工作区来容纳数据排序结果和原始表或现有聚集索引数据的临时副本。 当堆或聚集表具有多个分区时每个分区都有一个堆或 B 树结构其中包含该指定分区的行组。例如如果一个聚集表有 4 个分区那么将有 4 个 B 树每个分区一个。 聚集索引 Clustered Index · 聚集索引的叶节点就是实际的数据页 · 在数据页中数据按照索引顺序存储 · 行的物理位置和行在索引中的位置是相同的 · 每个表只能有一个聚集索引 · 聚集索引的平均大小大约为表大小的 5%左右 要使用索引来更有效地排序查询数据最直接的方式就是在你要排序的字段上建立聚集索引。在建立聚集索引之后SQL SERVER会重新组织数据页让其中的数据行按照聚集索引中键值的顺序存储。SQL SERVER不需要在硬盘上的数据一定要实际按照聚集索引排序但在建立聚集索引时会尝试在逻辑上排序数据的同时也会在物理上让数据尽可能地排序。在索引子叶层级中的每个数据页都有一个指针指向索引分页的前一页与后一页形成双向链接串行在内部的系统数据表包含了各索引子叶层第一个分页的地址为了保证数据在逻辑上是依照聚集索引的顺序存放的SQL SERVER 只需要由第一个分页开始并依照其连接串行一个接着一个依序寻找数据即可。如下图。 注聚集表是有聚集索引的表。 非聚集索引 非聚集索引是完全独立于数据表之外的结构所以不会影响数据行的顺序其子叶层包含索引行。每个索引行包含非聚集键值、行定位符和任意包含列或非键列。行定位符中存入的数据有两种类型书签BOOKMARK或聚集索引的键值。如果数据表上建立了聚集索引则行定位符中存入的数据就是聚集索引的键值。如果数据表没有建立聚集索引则行定位符中存入的数据就是书签即指向数据表中记录具体位置的ROWID也就是文档编号、分页编号与页内记录编号称之为SOLT编号所组合成的值。通过该ROWID 在数据表内获取数据就称为书签查找 BOOKMARK LOOKUP。所以一般通过非聚集索引查找到符合的键值后还会搭配书签查找。 当非聚集索引从结构中找到符合的记录时虽然在子叶层该键值是由小到大排序因此可能在一个分页上就有全部符合查询条件的键值但因为数据表中数据行的摆放是没有按顺序的或是说没有按照该非聚集索引的键值顺序摆放所以真正符合记录的数据是散布在文档各处的而SQL SERVER每次读取数据都是以数据页为单位因此找到一条记录所在位置后要先将存放该条记录的分页读到内存中再从该页读出记录。 因为BOOKMARK LOOKUP是进行随机的I/O操作当符合查询的记录很多时通过非聚集索引访问将导致数据页读取非常频繁就算两条记录在同一个分页该分页也会被重复读两次因此或符合的记录有N条就需要读取数据表内的分页N页虽然大部分的读取操作都是针对内存中的高速缓存但记录数过多时一样没有效率还不如数据表扫描全部扫描一遍把符合条件数据找出来。 虽然 SQL 2005 以后的版本中已经不在提 BOOKMARK LOOKUP了(但实际上却是换汤不换药)我们的很多搜索都是使用如下的搜索过程先在非聚集中找然后再在聚集索引中找。如下图。 非聚集索引 Unclustered Index · 非聚集索引的页不是数据而是指向数据页的页。 · 若未指定索引类型则默认为非聚集索引 · 叶节点页的次序和表的物理存储次序不同 · 每个表最多可以有 249个非聚集索引一般认为每个表不应该超过10个索引 · 在非聚集索引创建之前创建聚集索引否则会引发索引重建 聚集索引与非聚集索引使用的情况 动作描述 使用聚集索引 使用非聚集索引 外键列 应 应 主键列 应 应 列经常被分组排序(order by) 应 应 返回某范围内的数据 应 不应 小数目的不同值 应 不应 大数目的不同值 不应 应 频繁更新的列 不应 应 频繁修改索引列 不应 应 一个或极少不同值 不应 不应 今天就普及一下索引的一些基本知识明天来说明怎么选择要创建索引的列条件是什么方法是什么。转载于:https://www.cnblogs.com/chillsrc/archive/2012/09/19/2694313.html