聚集索引

SQLSERVER聚集索引和主键的误区

自作多情 提交于 2019-12-23 15:57:22
SQLSERVER聚集索引和主键的误区 很多人会把Primary Key和聚集索引搞混起来,或者认为这是同一个东西。这个概念是非常错误的。 主键是一个约束(constraint),他依附在一个索引上,这个索引可以是聚集索引,也可以是非聚集索引。 所以在一个(或一组)字段上有主键,只能说明他上面有个索引,但不一定就是聚集索引。 例如下面: 1 USE [pratice] 2 GO 3 CREATE TABLE #tempPKCL 4 ( 5 ID INT PRIMARY KEY CLUSTERED --聚集索引 6 ) 7 8 9 --------------------------------- 10 USE [pratice] 11 GO 12 CREATE TABLE #tempPKNCL 13 ( 14 ID INT PRIMARY KEY NONCLUSTERED --非聚集索引 15 ) 16 17 18 DROP TABLE [#tempPKCL] 19 DROP TABLE [#tempPKNCL] 如果不加 NONCLUSTERED 和 CLUSTERED 关键字,默认建的是聚集索引 而一个聚集索引里,是可以有重复值的。只要他没有被同时设为主键,但是主键不能有重复值(不管依附在聚集索引上还是非聚集索引上) 强调这一点,是因为有些人觉得自己的表格上设置了主键

MongoDB基本命令用

久未见 提交于 2019-12-23 09:48:03
成功启动MongoDB后,再打开一个命令行窗口输入mongo,就可以进行数据库的一些操作。 输入help可以看到基本操作命令: show dbs:显示数据库列表 show collections:显示当前数据库中的集合(类似关系数据库中的表) show users:显示用户 use <db name>:切换当前数据库,这和MS-SQL里面的意思一样 db.help():显示数据库操作命令,里面有很多的命令 db.foo.help():显示集合操作命令,同样有很多的命令,foo指的是当前数据库下,一个叫foo的集合,并非真正意义上的命令 db.foo.find():对于当前数据库中的foo集合进行数据查找(由于没有条件,会列出所有数据) db.foo.find( { a : 1 } ):对于当前数据库中的foo集合进行查找,条件是数据中有一个属性叫a,且a的值为1 MongoDB没有创建数据库的命令,但有类似的命令。 如:如果你想创建一个“myTest”的数据库,先运行use myTest命令,之后就做一些操作(如:db.createCollection('user')),这样就可以创建一个名叫“myTest”的数据库。 数据库常用命令 1、Help查看命令提示 help db.help(); db.yourColl.help(); db.youColl.find().help();

SQL Server 创建索引的 5 种方法

人走茶凉 提交于 2019-12-23 02:37:49
前期准备: create table Employee ( ID int not null primary key, Name nvarchar(4), Credit_Card_ID varbinary(max)); --- 小心这种数据类型。 go 说明:本表上的索引,都会在创建下一个索引前删除。 ------------------------------------------------------------------------------------------------------------------------------------------------------------- 操作 1、 创建聚集索引 方法 1、 alter table table_name add constraint cons_name priamry key(columnName ASC|DESC,[.....]) with (drop_existing = on); alter table Employee add constraint PK_for_Employee primary key clustered (ID); go 这个是一种特别的方法,因为在定义主键的时候,会自动添加索引,好在加的是聚集索引还是非聚集索引是我们人为可以控制的。 通过sp_helpindex

聚集索引和非聚集索引

拥有回忆 提交于 2019-12-22 07:17:07
聚集索引和非聚集索引 聚集索引: 按照每张表的主键构造B+树,非叶子节点用来存放索引,叶子节点(数据页)用来存放整张表的行记录数据,按照主键的顺序排序,每个数据页都通过一个双向链表来连接,因此,聚集索引能够在B+树索引的叶子节点上直接找到数据,而且对主键的排序查找和范围查找速度非常快。(聚集索引的存储不是物理上连续的,而是逻辑上连续的,这样可以降低维护成本。每张表只能有一个聚集索引,因为数据页只能按照一棵B+树来排序) 非聚集索引(辅助索引): 叶子节点存放的是键值对,还包含一个指针,指向聚集索引的主键。当通过非聚集索引来查找数据时,首先遍历非聚集索引,找到对应的叶子节点,并获得对应聚集索引的主键,然后通过这个聚集索引找到对应的行,所以它需要两次索引查找。 聚集索引优点: 可以把相关数据存放在一起。比如实现电子邮箱获取用户邮件时,如果不使用聚集索引,则每封邮件都可能产生一次磁盘IO,如果采用聚集索引,根据用户ID来聚集数据,那么只需要从磁盘读取少量的数据页就可以获得某个用户全部的邮件了。 数据访问更快。因为聚集索引将索引和数据保存在同一个B+树中,查找效率高。 聚集索引缺点: 更新聚集索引列的代价很高,因为会强制InnoDB将每个被更新的行移动到新的位置。 插入新行时,如果要插入的页已经满了,那么存储引擎会将该页分裂成两个页面来容纳该行,所以页分裂会导致表占用更多的磁盘空间。

SQL Server索引技术

别等时光非礼了梦想. 提交于 2019-12-21 11:37:00
索引的分类说明 聚集索引:基于记录在数据表内的排序和存储位置。因为数据的物理排序只能有一种方式,所以在一个表中,只能有一个字段设为聚集索引。 非聚集索引:将索引建立在索引页上,查询时从索引中找到记录存放的位置。 唯一索引:当字段设置了唯一索引,那么不同记录的同一字段就是唯一的。当数据表中创建了主键后,数据库会自动为该主键创建唯一索引。 复合索引:将多个字段组合起来作为索引,称为复合索引。只有用到复合索引的第一个字段或整个复合索引字段作为条件查询才会用到该索引。 包含性列索引:创建索引时,最多的字段数不能超过 16 个,并且所有字段大小之和不能超过 900 字节,包含性列索引就是为解决该类问题而产生的。 视图索引:如果为视图创建索引,将会具体化视图,并将结果集永久存储在视图中。 全文索引:全文索引有全文引擎服务来创建和维护。主要用于大量文本中搜索字符串,效率比 T-SQL 中 like 语句高得多。 XML 索引 :在 xml 字段上创建的索引就是 XML 索引。 创建索引的语法 CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED]INDEX <index name> ON <table or view name>(<column name> [ASC|DESC][,...n])INCLUDE (<column name> [,...n])[ WITH

大数据量数据库优化

血红的双手。 提交于 2019-12-19 06:31:06
大数据量数据库优化 一、数据库结构的设计 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能。所以,在一个系统开始实施之前,完备的数据库模型的设计是必须的。 在一个系统分析、设计阶段,因为数据量较小,负荷较低。我们往往只注意到功能的实现,而很难注意到性能的薄弱之处,等到系统投入实际运行一段时间后,才发现系统的性能在降低,这时再来考虑提高系统性能则要花费更多的人力物力,而整个系统也不可避免的形成了一个打补丁工程。 所以在考虑整个系统的流程的时候,我们必须要考虑,在高并发大数据量的访问情况下,我们的系统会不会出现极端的情况。(例如:对外统计系统在7月16日出现的数据异常的情况,并发大数据量的的访问造成,数据库的响应时间不能跟上数据刷新的速度造成。具体情况是:在日期临界时(00:00:00),判断数据库中是否有当前日期的记录,没有则插入一条当前日期的记录。在低并发访问的情况下,不会发生问题,但是当日期临界时的访问量相当大的时候,在做这一判断的时候,会出现多次条件成立,则数据库里会被插入多条当前日期的记录,从而造成数据错误。),数据库的模型确定下来之后,我们有必要做一个系统内数据流向图,分析可能出现的瓶颈。 为了保证数据库的一致性和完整性,在逻辑设计的时候往往会设计过多的表间关联,尽可能的降低数据的冗余。(例如用户表的地区

聚集索引和非聚集索引

血红的双手。 提交于 2019-12-17 21:48:50
聚集索引 一种索引,该索引中键值的逻辑顺序决定了表中相应行的物理顺序。 我们的汉语字典的正文本身就是一个聚集索引。比如,我们要查“安”字,就会很自然地翻开字典的前几页,因为“安”的拼音是“an”,而按照拼音排序汉字的字典是以英文字母“a”开头并以“z”结尾的,那么“安”字就自然地排在字典的前部。 非聚集索引 如果您认识某个字,您可以快速地从自动中查到这个字。但您也可能会遇到您不认识的字,不知道它的发音,这时候,您就不能按照刚才的方法找到您要查的字,而需要去根据“偏旁部首”查到您要找的字,然后根据这个字后的页码直接翻到某页来找到您要找的字。但您结合“部首目录”和“检字表”而查到的字的排序并不是真正的正文的排序方法,比如您查“张”字,我们可以看到在查部首之后的检字表中“张”的页码是672页,检字表中“张”的上面是“驰”字,但页码却是63页,“张”的下面是“弩”字,页面是390页。很显然,这些字并不是真正的分别位于“张”字的上下方,现在您看到的连续的“驰、张、弩”三字实际上就是他们在非聚集索引中的排序,是字典正文中的字在非聚集索引中的映射。我们可以通过这种方式来找到您所需要的字,但它需要两个过程,先找到目录中的结果,然后再翻到您所需要的页码。我们把这种目录纯粹是目录,正文纯粹是正文的排序方式称为“非聚集索引”。 来源: https://www.cnblogs.com/sanjun/p

SQl浅谈 索引

廉价感情. 提交于 2019-12-17 16:49:08
1、索引的工作原理 我给大家推荐一个别人的总结。 http://blog.csdn.net/NightManHAHA/article/details/5648579 2、索引的设计原则 对于一张表来说,索引的有无和建立什么样的索引,要取决与where字句和Join表达式中。 一般来说建立索引的原则包括以下内容: 主键列:系统一般会自动建立聚集索引。 非主键列:有大量重复值并且经常进行条件查询、排序、分组的列,或者经常频繁访问的列,考虑建立聚集索引。 如果在一个经常做插入操作的表中建立索引,应使用fillfactor(填充因子)来减少页分裂,同时提高并发度降低死锁的发生。如果在表为只读表,填充因子可设为100。 另外我们在选择索引键的时候,尽量采用小数据类型(最好是整数)的列作为索引键,这样每个索引页能尽可能多的容纳索引键和指针,用整数的好处是因为整数的访问速度最快。 3、使用索引的注意事项 动作描述 使用聚集索引 使用非聚集索引 外键列 应 应 主键列 应 应 列经常被分组排序(order by) 应 应 返回某范围内的数据(BETWEEN、>、>=、< 和 <=) 应 小数目的不同值 应 大数目的不同值 应 频繁更新的列 应 频繁修改索引列 应 一个或极少不同值 4、索引的分类 按存储结构区分 : “聚集索引(又称聚类索引,簇集索引)”,“分聚集索引(非聚类索引,非簇集索引)”

SQL Server基础之索引

杀马特。学长 韩版系。学妹 提交于 2019-12-17 16:45:17
索引分类:从物理结构上可分为两种:聚集索引和非聚集索引 (此外还有空间索引、筛选索引、XML索引) 因为聚集索引是索引顺序与物理存储顺序一致,所以只能建一个。 聚集索引就是把数据按主键顺序存储; 因为一张表中的数据只能有一个物理顺序,所以一张表只能有一个主键/聚集索引。 非聚集索引可以建1或者N个。 并不是所有字段上都可以建索引,有的字段类型如text、image、nvarchar(max)等是不可以建索引的。 sql语句有多个条件用and连接时,多个字段都有索引的话,顺序很重要。 索引是存在磁盘的文件,一个表上如果有100个列,但是不能建太多索引,因为进行插入,修改,删除时都需要对索引文件进行修改,会影响增删改的效率,所以要平衡索引的个数。 索引的数据结构长什么样子呢? 文章: SQL Server 索引(一)数据结构和存储结构 讲了索引概念和结构。 在SQL Server数据库中,索引的存储是以B+树(注意和二叉树的区别)结构来存储的,又称索引树,其节点类型为如下两种: 索引节点; 叶子节点 索引节点按照层级关系,有时又可以分为根节点和中间节点,其本质是一样的,都只包含下一层节点的入口值和入口指针; 叶子节点就不同了,它包含数据,这个数据可能是表中真实的数据行,也有可能是索引列值和行书签,前者对应于聚集索引,后者对应于非聚集索引。 通过DBCC IND命令来查看索引的情况

SQL Server 深入解析索引存储(非聚集索引)

依然范特西╮ 提交于 2019-12-17 09:55:15
标签:SQL SERVER/MSSQL SERVER/数据库/DBA/索引体系结构/非聚集索引 概述 非聚集索引与聚集索引具有相同的 B 树结构,它们之间的显著差别在于以下两点: 基础表的数据行不按非聚集键的顺序排序和存储。 非聚集索引的叶层是由索引页而不是由数据页组成。 既可以使用聚集索引来为表或视图定义非聚集索引,也可以根据堆来定义非聚集索引。非聚集索引中的每个索引行都包含非聚集键值和行定位符。此定位符指向聚集索引或堆中包含该键值的数据行。 非聚集索引行中的行定位器或是指向行的指针,或是行的聚集索引键,如下所述: 如果表是堆(意味着该表没有聚集索引),则行定位器是指向行的指针。该指针由文件标识符 (ID)、页码和页上的行数生成。整个指针称为行 ID (RID)。 如果表有聚集索引或索引视图上有聚集索引,则行定位器是行的聚集索引键。如果聚集索引不是唯一的索引,SQL Server 将添加在内部生成的值(称为 唯一值 )以使所有重复键唯一。此四字节的值对于用户不可见。仅当需要使聚集键唯一以用于非聚集索引中时,才添加该值。SQL Server 通过使用存储在非聚集索引的叶行内的聚集索引键搜索聚集索引来检索数据行。 对于索引使用的每个分区,非聚集索引在 index_id >0 的 sys.partitions 中都有对应的一行。默认情况下,一个非聚集索引有单个分区