首页
学习
活动
专区
圈层
工具
发布

sql server 聚集索引,非聚集索引,Identity ,gudi,主键的概念和比较

微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。...聚集索引和非集聚索引 聚集索引:该索引中键值的逻辑顺序决定了表中相应行的物理顺序。 非聚集索引:该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同。...Identity identity表示该字段的值会自动更新,如果我们设置了标识符,并且设置自增和自增种子,那么数据库里面的改字段就会按照我们的自增种子自动进行递增,通常我们使用改字段作为主键。...因为主键默认是聚集索引,所以我们再使用guid作为主键的时候数据量比较大的话就有性能问题。...但是如果数据量小就放心的使用吧,但是如果是分布式的数据库,又不能用int作为主键怎么办,这个时候我们可以选择两种方式混合用,再自己的数据库用int 这样查询和修改就比较快,同时使用guid作为唯一标识,

1.3K30

数据库模型设计——主键的设计

在数据库设计时,主要就是对实体和关系的设计,实体表现出来就是表,关系表现出来就是外键。而对于一个表,由两部分组成:主键和属性。主键的简单定义就是表中为每一行数据的唯一标识。...通常情况下,RDBMS会在主键上建立聚集索引(SQL Server默认都这么做),由于我们使用B-Tree的数据结构来存储索引数据,所以一般对主键有以下两个要求: 越短越好——越短在一个Page中存储的节点越多...通过上面的比较,我们知道使用数字类型是更好的方式,那么我们为什么还会有人使用GUID和字符串来当主键呢?那是因为: 相对于数字类型,字符类型更易读易记,在检索关联的数据时,更方便直接。...联合主键主要使用在多对多的关系时,中间表就需要使用联合主键。在简单的多对多关系中,我们不需要为中间的关联建立实体,所以中间表可能就只需要两列,分别是两个实体表的主键。...以SQL Server为例,默认情况下,建立主键的列,就会建立聚集索引,但是实际上,我们可以在建立主键时不使用聚集索引。

1.4K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    关于SQL Server数据库设计的感悟,请指教

    我引用联机文档中的原话来描述一下: 在创建非聚集索引之前,应先了解访问数据的方式。考虑对具有以下属性的查询使用非聚集索引: 使用 JOIN 或 GROUP BY 子句。...应为联接和分组操作中所涉及的列创建多个非聚集索引,为任何外键列创建一个聚集索引。 不返回大型结果集的查询。...关于主键: 我比较倾向于主键的业务无关性,用的是著名的GUID。虽然占用空间较大,效率也偏低,但是在找不出其它更好的方法。...需要注意的是,建立主键时,SQL Server默认会把主键设置为聚合索引,一定要把他去掉,设置在更有意义的其它字段上,或者压根就不设。 GUID的好处很多,有: 生成主键简单,可预知。...没有并发时主键重复的烦恼。 防止用户手动更改数据库中的数据,一看到GUID,就都吓回去了。 避免数据库表迁移时的麻烦(用自增型的主键,在表迁移时简直就是灾难)。

    1.1K20

    【BCVP升级】泛型主键的使用

    所以我就尝试了这个新课题:使用泛型主键,这样拿到这个项目的时候,自己修改下主键类型,就可以运行了,不过目前还没有百分百完善,int主键已经调通,其他类型主键,比如Guid或者自定义string还没有完成生产化...1、自定义特性 配置服务SqlsugarSetup 既然要实现泛型主键,那我们就需要对主键进行处理,因为只有int类型的主键才需要自增,其他类型的是不需要的,当然如果在非int类型的主键上配置自增了也是会报错的...我参照着实体泛型基类,又单独针对特定的有外键需求的实体,抽离了一个中间父类,请注意我的命名:实体类-->父类(非必须)-->泛型基类,用UserRole来举例。...但是现在用了Guid以后,就不能这么用了,因为这样使用的话,这个方法是无效的.ExecuteReturnIdentityAsync(),不仅不会正常的返回id值,也无非自动生成Guid的默认值,你可以使用....ExecuteCommandAsync(),当然可以直接使用.ExecuteReturnEntityAsync()这个方法,来返回实体,然后从实体里,获取对应的Id,这样的话,不论是int还是Guid

    79110

    数据库索引结构知多少

    在大多数情况下,默认建立的聚集索引是不起作用的,还是需要结合实际的业务场景来考虑,特别是在选择自增ID或GUID这种主键的情况。...创建主键,不可以在允许为Null值的列上创建,并且既有的数据记录中不可以有重复值,否则报错。聚集索引没有限制建立聚集索引的列一定必须 not null ,并且数据即可以唯一,也可以不唯一。...3.聚集索引 与 非聚集索引 聚集索引叶子层:具体的数据,按照聚集键顺序存储 非聚集索引叶子层:指针,指针有2类数据 RID或者是聚集键。...常见的书签查找有两种:一个是键查找(key lookup,聚簇索引的表),还有一个就是RID查找(RID lookup,堆表)。 使用覆盖索引,让非聚集索引包含查询列,从而避免书签查找。...但是非聚集索引最大键列数为16,最大索引键大小为900字节,所以覆盖索引还是有限制的,此时可以考虑 使用include属性来包含非键列。

    66100

    数据库索引结构知多少

    在大多数情况下,默认建立的聚集索引是不起作用的,还是需要结合实际的业务场景来考虑,特别是在选择自增ID或GUID这种主键的情况。...创建主键,不可以再允许为Null值的列上创建,并且既有的数据记录中不可以有重复值,否则报错。聚集索引没有限制建立聚集索引的列一定必须 not null ,并且数据即可以唯一,也可以不唯一。...3.聚集索引 与 非聚集索引 聚集索引叶子层:具体的数据,按照聚集键顺序存储 非聚集索引叶子层:指针,指针有2类数据 RID或者是聚集键。...常见的书签查找有两种:一个是键查找(key lookup,聚簇索引的表),还有一个就是RID查找(RID lookup,堆表)。 使用覆盖索引,让非聚集索引包含查询列,从而避免书签查找。...但是非聚集索引最大键列数为16,最大索引键大小为900字节,所以覆盖索引还是有限制的,此时可以考虑 使用include属性来包含非键列。

    43330

    基于ABP落地领域驱动设计-02.聚合和聚合根的最佳实践和原则

    领域对象是DDD的核心,我们会依次分析聚合/聚合根、仓储、规约、领域服务的最佳实践和规则。内容较多,会拆分成多个章节单独展开。...如果你仔细想想,当使用非关系型数据库(如MongoDB)时,当Role和User都有关系列表时还有一个问题:在这种情况下,相同的信息会在不同的集合中重复出现,将很难保持数据的一致性,每当你在User.Roles...聚合根/实体中的主键 一个聚合根通常有一个ID属性作为其标识符(主键,Primark Key: PK)。推荐使用 Guid 作为聚合根实体的PK。 聚合中的实体(不是聚合根)可以使用复合主键。...示例:聚合根和实体 //聚合根:单个主键 public class Organization { public Guid Id{get;set;} public string Name{get;...业务逻辑和实体中的异常处理 当你在实体中进行验证和实现业务逻辑,经常需要管理异常: 创建特定领域异常。 必要时在实体方法中抛出这些异常。

    3.7K30

    .Net 从零开始构建一个框架之基本实体结构与基本仓储构建

    ,持久化对象和非持久化对象.本文主要讨论的是持久化对象,即需要写入到数据库或者其他数据容器中的对象,也就是实体(当然这里不是所谓的实体,而是通过OOP技术构建出来的一个实体结构,这个结构需要满足日常开发中绝大多数的业务需求...).接下去,就是使用OOP技术来构建这个实体结构....首先这个实体既然需要写入数据库,那么它必定有一个主键Id.同时这个主键Id可以是任意数据类型,当然用的最多的就是GUID和INT作为主键.前面全局唯一,后者查询效率快....接着,基本实体就出现了,这里我分为两类,一类以int为主键,一类已Guid主键,为别写道两个类中,如下代码: /// /// 以int为主键的实体类型 ///...,当然这里你可以随意的扩展,比如构建各种各样的默认的实体类,如主键为string的只具有修改和删除的实体类.可以根据业务的实体特性来动态的扩展.也可以向所有的抽象实体类中添加任意的抽象属性或者方法.比如给

    85830

    MySQL性能优化(三)-- 索引

    二、索引的“类型” 1.聚集索引:节点就是数据本身,即索引表中存的就是数据本身 2.非聚集索引:节点仍然是索引节点,只不过有指向对应数据块的指针,上面所说的BTREE索引就是非聚集索引 聚集索引的速度比非聚集索引快...三、索引的类型 1.单列索引(一个索引只包含一个列,一个表可以有多个单列索引) 1-1.主键索引:primary key 创建主键索引,有两种方式,其中t1和t2位表名,id为列: 1)建表的时候创建:...1-4.全文索引:fulltext 数据库自带的全文索引,对中文支持不友好,可以借助第三方的框架,如:sphinx(斯芬克斯)、coreseek 2.多列索引(组合索引,一个组合索引包含两个或两个以上的列...); 查询sql是否使用到了索引,可以使用explain进行分析,后续会给出介绍。...: 1.索引也需要存储,所以也需要空间,实际上索引也是一张表,保存了索引字段的值和指向实体表的指针 2.降低更新(增删改)表的速度,更新不仅仅只是数据本身,如果数据正好是索引字段,同时需要更新索引信息

    58410

    关于Int自增字段和GUID字段的性能测试。只有测试,没有分析,呵呵

    最近有两篇关于GUID和Int自增的文章,我是一直使用Int自增的,不习惯使用GUID,感觉GUID很麻烦,用着不方便,性能也比不上Int自增。...主键、外键是Int自增 VS 主键、外键是GUID。       对比一下在多表关联的情况下,二者的性能如何?       疑问:聚集索引是否都要设置到哪里?       ...对于Int的自然是把聚集索引设置到主键上了,但是GUDI呢?没有用过GUID,不清楚了。不过不管三七二十一,测试了再说。就先把聚集索引也设置到GUID上面吧。...第一组表用Int作为主键,第二组表以GUID作为主键。字段嘛,咱们就简单一点吧。 【客户信息表】 客户ID、客户名称、地址、添加时间。 其中 客户ID 是主键、聚集索引、 Int自增。...其中 合同ID 是主键、聚集索引、GUID。 3、 添加测试数据。       客户信息6.5万,合同信息26.2万。每一个客户都有4条合同信息。

    1.3K100

    堂妹问我:innodb是如何插入数据的?

    对于聚集索引(一般是主键索引)数据段存储的是索引关键字和业务行(所有字段);对于非聚集索引,数据段存储的是索引关键字和主键;如果通过非聚集索引查询,需要先通过B+树查出主键,再通过主键从聚集索引中二次查询具体的行...下图:左边为二级索引(非聚集索引),右边为主键索引(聚集索引) ? 表数据是通过聚集索引组织存储,也即按主键索引创建的B+树存储数据,因此创建表时应该同时指定一个主键。...如果没有指定主键,也没有创建唯一索引,表会默认创建一个自增的隐藏字段:row_id做为聚集索引B+树的关键字段。因为是隐藏字段,所以这个字段只能回表查询时使用。...如果聚集索引使用的是自增的主键,那么数据是以追加的方式存储在每一页中,如果页已经存满,只需要重新分配一页空间继续追加即可。...创建聚集索引 如果指定的主键或唯一索引,则使用指定的列创建聚集索引,否则使用隐藏列row_id创建聚集索引,并存储到information_schema.innodb_indexes中 ?

    90310

    MSSQL之七 数据完整性

    l 主键列不允许空值。 l 主键约束在指定的列上创建了一个唯一性索引。该唯一性索引既可以是聚集索引,也可以是非聚集索引。在默认情况下创建的是聚集索引。...如果表中已经有聚集索引,那么在创建主键约束之前,要么把已有的聚集索引删除,要么指定所创建的索引是非聚集索引。...这种约束通过实现唯一性索引来强制实体完整性。当表中已经有了一个主键约束时,如果需要在其他列上实现实体完整性,又因为表中不能有两个或两个以上的主键约束,所以只能通过创建UNIQUE约束来实现。...但是,UNIQUE约束所在的列并不是表的主键列。 l UNIQUE约束强制在指定的列上创建一个唯一性索引。在默认情况下,是创建唯一性的非聚集索引。...但是,在定义UNIQUE约束时也可以指定所创建的索引是聚集索引。 Ø 外键约束 外键约束强制引用完整性。

    30000

    mysql 自增id和UUID做主键性能分析,及最优方案

    关于UUID这个标准使用最普遍的是微软的GUID(Globals Unique Identifiers)。...1.为什么要使用uuid做主键 (1).其实在innodb存储引擎下,自增长的id做主键性能已经达到了最佳。不论是存储和读取速度都是最快的,而且占的存储空间也是最小。...(3).InnoDB主索引:叶节点包含了完整的数据记录。这种索引叫做聚集索引。InnoDB 的索引能提供一种非常快速的主键查找性能。...InnoDB 不会压缩索引 (4).聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。...综合上述可得: (1).如果InnoDB表的数据写入顺序能和B+树索引的叶子节点顺序一致的话,这时候存取效率是最高的。为了存储和查询性能应该使用自增长id做主键。

    8.7K20

    MySQL 索引

    索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。 优点: 索引大大提高了查询速度 缺点: 降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。...它有以下几种创建方式: 创建索引 CREATE UNIQUE INDEX indexName ON mytable(username(length)) 上面这样情况下创建的是非聚集索引,它和使用NONCLUSTERED...CREATE UNIQUE NONCLUSTERED INDEX indexName ON mytable(username(length)) 如果要创建聚集索引,可使用关键字clustered,代码如下...: CREATE UNIQUE CLUSTERED INDEX indexName ON mytable(username(length)) 聚集索引和非聚集索引-详解 修改表结构 ALTER table...ADD INDEX (c); 删除索引 mysql> ALTER TABLE testalter_tbl DROP INDEX c; 使用 ALTER 命令添加和删除主键 主键只能作用于一个列上,添加主键索引时

    20310

    .NET EF Core(Entity Framework Core)

    2:数据表列的名字采用实体类属性的名字,列的数据类型采用和实体类属性类型最兼容的类型。 3:数据表列的可空性 取决于对应实体类属性的可空性。...4:名字为Id的属性为主键,如果主键为short, int 或者 long类型,则默认采用自增字段,如果主键为Guid类型,则默认采用默认的Guid生成机制生成主键值。...默认把名字为Id或者“实体类型+Id“的属性作为主键,可以用HasKey()来配置其他属性作为主键。...{ p.FirstName, p.LastName }); 唯一索引:IsUnique();聚集索引:IsClustered() 8、… 通过代码查看EF Core的sql语句 方法1:标准日志 nuget...锁是和事务相关的,因此通过BeginTransactionAsync()创建一个事务,并且在所有操作完成后调用CommitAsync()提交事务。

    1.4K12

    主键、聚集索引、辅助索引

    如果在创建表时没有显式地定义主键,InnoDB 存储引擎会按如下方式选择或创建主键: 首先判断表中是否有非空的唯一索引(Unique NOT NULL),如果有,则该列即为主键 如果不符合上述条件,InnoDB...存储引擎自动创建一个 6 字节大小的指针 _rowid 作为主键 那如果表中有多个非空唯一索引时怎么办呢?...一张表只能有一个主键,并且也只能有一个聚集索引,聚集索引还是按照主键来构建的,那这种种迹象不都表明主键就是聚集索引? 事实上,主键和索引就不是一个层次的东西!...而至于 “主键就是索引” 这种观点的由来,是因为:InnoDB 存储引擎中,每张表都一定存在主键(显示或隐式),而聚集索引依赖于主键的建立,所以如果没有强制指定使用非聚集索引,InnoDB 在创建主键的同时会建立一个唯一的聚集索引...所以,不要说 “主键就是聚集索引”,应该这样说:“聚集索引一般都是加在主键上的”。 聚集索引和辅助索引的关系 辅助索引(Secondary Index)也称为 非聚集索引、二级索引。

    99610

    MySQL——索引实现原理

    MyISAM的索引方式索引和数据存放是分开的,非聚集”的,所以也叫做非聚集索引。 InnoDB索引实现 虽然InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。...InnoDB的二级索引示意如图: 使用InnoDB主键应该知道的事项 因为InnoDB的索引的方式通过主键聚集数据,严重依赖主键。索引如果没有定义主键,那么InnoDB会选择一个唯一的非空索引代替。...聚簇索引的优点有: 1.可以把相关数据存储在一起,减少数据查询时的磁盘I/O 2.数据访问更快,因为聚簇索引就是表,索引和数据保存在一个B+Tree中 3.使用索引覆盖的查询时可以直接使用页节点中的主键值...基于聚簇索引以上的这些特点,在InnoDB中,我们应该尽量使用和应用无关的主键,例如自增主键,这样可以保证数据行是按照顺序写入的。而不是使用GUID、UUID生成随机的主键。...可以通过MyISAM和InnoDB如何存放表的抽象图帮助快速理解。 InnoDB(聚簇)表分布: MyISAM(非聚簇)表分布:

    74721

    快速学完数据库管理

    --联系也可以有属性 -- 一对一的联系 --在两个实体之间任意一个加入另外一个实体的主键即可产生联系 -- 一对多的联系 --在多端实体加入一端实体的主键即可产生联系 -- 多对多的联系...--需要另外创建一张表进行产生联系 --按照需要建立一个两个字段的表即可 一个表的表示方式 -- 主键一般就在字段下面用下划线表示,表名一般就是实体的名字 --主键由单个字段构成 --表名(字段...作用:使得字段非空且唯一 --这里就是创建了一个主键约束 create table student( name varchar(10) primary key, age int ) 如果想从现有表进行添加主键约束...--分为聚集索引和非聚集索引 --聚集索引只能有一个 --非聚集索引可以有多个 --索引旨在提高检索数据的速度,同时也需要付出一定的代价,即占用一部分空间 --聚集clustered --非聚集nonclustered...,count(具体列名)则代表非空的数据 --当条件中有出现聚集函数必须使用having子句进行限制,不能使用where --聚集函数相当于在分组里面进行计算,故select 中选择的属性必须包含在group

    2.1K30

    Java面试手册:数据库 ⑤

    通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性; 大大加快数据的检索速度,这也是创建索引的最主要的原因; 加速表和表之间的连接; 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间...主键是一种特殊的唯一性索引,其可以是聚集索引,也可以是非聚集索引。 在SQLServer中,主键的创建必须依赖于索引,默认创建的是聚集索引,但也可以显式指定为非聚集索引。...InnoDB作为MySQL存储引擎时,默认按照主键进行聚集,如果没有定义主键,InnoDB会试着使用唯一的非空索引来代替。如果没有这种索引,InnoDB就会定义隐藏的主键然后在上面进行聚集。...所以,对于聚集索引来说,你创建主键的时候,自动就创建了主键的聚集索引。 索引设计原则 在一张表上只能创建一个聚集索引,因为真实数据的物理顺序只可能是一种。...在索引覆盖的情况下,包含两种索引扫描: 创建索引:创建(唯一)[聚集|非聚集] 索引 索引名 在表名{列_名} CREATE[UNIQUE] [CLUSTERED|NONCLUSTERED]

    81720

    MySQL 索引概览

    文章目录 前言 概览 索引定义 索引优缺点 优点 缺点 索引类型 按功能逻辑划分 普通索引 唯一索引 主键索引 全文索引 按物理实现划分 聚集索引(clustered index) 非聚集索引(non-clustered...实际上,索引也是一张表,这张表保存了主键与索引字段,并指向实体表的记录(类似指针)。...按物理实现划分 按物理实现方式来划分,通常可以分为聚集索引和非聚集索引。...聚集索引在创建主键时自动生成,如果没有主键,则根据第一个不为空的唯一索引自动生成,如果还没有,则自动生成一个隐式的聚集索引。...需要注意的是,在进行查询操作的时候,聚集索引的效率更高,因为少了一次查找;但是进行修改操作的时候,效率比非聚集索引低,因为直接修改了数据内容,为了标准数据内容的顺序和聚集索引顺序一致,会对数据页重新排序

    89720
    领券