精华内容
下载资源
问答
  • 唯一索引与主键索引的比较
    千次阅读
    2019-02-20 23:02:51

    感谢博主:https://www.cnblogs.com/ymj0906/p/4240856.html

    唯一索引
    唯一索引不允许两行具有相同的索引值。
    如果现有数据中存在重复的键值,则大多数数据库都不允许将新创建的唯一索引与表一起保存。当新数据将使表中的键值重复时,数据库也拒绝接受此数据。例如,如果在 employee 表中的职员姓氏(lname) 列上创建了唯一索引,则所有职员不能同姓。

    主键索引
    主键索引是唯一索引的特殊类型。
    数据库表通常有一列或列组合,其值用来唯一标识表中的每一行。该列称为表的主键。
    在数据库关系图中为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的。当在查询中使用主键索引时,它还允许快速访问数据。

    它们的一些比较:
    (1)对于主健/unique constraint , oracle/sql server/mysql等都会自动建立唯一索引;
    (2)主键不一定只包含一个字段,所以如果你在主键的其中一个字段建唯一索引还是必要的;
    (3)主健可作外健,唯一索引不可;
    (4)主健不可为空,唯一索引可;
    (5)主健也可是多个字段的组合;
    (6)主键与唯一索引不同的是:
    a.有not null属性;
    b.每个表只能有一个。

     

    1、主键

    主键ID,主键既是约束也是索引,同时也用于对象缓存的键值。

    2、索引

           *组合或者引用关系的子表(数据量较大的时候),需要在关联主表的列上建立非聚集索引(如订单明细表中的产品ID字段、订单明细表中关联的订单ID字段)

           *索引键的大小不能超过900个字节,当列表的大小超过900个字节或者若干列的和超过900个字节时,数据库将报错。

           *表中如果建有大量索引将会影响INSERT、UPDATE和DELETE语句的性能,因为在表中的数据更改时,所有的索引都将必须进行适当的调整。需要避免对经常更新的表进行过多的索引,并且索引应保持较窄,就是说:列要尽可能的少。

           *为经常用于查询的谓词创建索引,如用于下拉参照快速查找的code、name等。在平台现有下拉参照的查询sql语句中的like条件语句要改成不带前置通配符。还有需要关注Order By和Group By谓词的索引设计,Order By和Group By的谓词是需要排序的,某些情况下为Order By和Group By的谓词建立索引,会避免查询时的排序动作。

           *对于内容基本重复的列,比如只有1和0,禁止建立索引,因为该索引选择性极差,在特定的情况下会误导优化器做出错误的选择,导致查询速度极大下降。

     

          *当一个索引有多个列构成时,应注意将选择性强的列放在前面。仅仅前后次序的不同,性能上就可能出现数量级的差异。

           *对小表进行索引可能不能产生优化效果,因为查询优化器在遍历用于搜索数据的索引时,花费的时间可能比执行简单的表扫描还长,设计索引时需要考虑表的大小。记录数不大于100的表不要建立索引。频繁操作的小数量表不建议建立索引(记录数不大于5000条)

     扩展阅读:

    http://topic.csdn.net/t/20041108/15/3532352.html

    更多相关内容
  • 总结,对于主键与唯一索引约束: • 执行insert和update时,会触发约束检查 • InnoDB违反约束时,会回滚对应SQL • MyISAM违反约束时,会中断对应的SQL,可能造成不符合预期的结果集 • 可以使用 insert … on ...
  • 聚簇索引与主键的选择一、什么是聚簇索引?二、什么是非聚簇索引?1. InnoDB引擎中2. MyISAM引擎中三、聚簇索引的优劣与主键选择的关系 一、什么是聚簇索引? 首先,聚簇索引不是一种单独的索引类型,其实是数据的...
  • MySQL索引主键索引

    2020-12-15 16:43:01
    主键索引,简称主键,原文是PRIMARY KEY,由一个或多个列组成,用于唯一性标识数据表中的某一条记录。一个表可以没有主键,但最多只能有一个主键,并且主键值不能包含NULL。 在MySQL中,InnoDB数据表的主键设计我们...
  • Oracle唯一索引与主键区别

    千次阅读 2019-11-13 21:10:54
  • 唯一约束和唯一索引区别: 唯一约束和唯一索引在 MySQL 数据库里区别: 概念上不同,约束是为了保证数据的完整性,索引是为了辅助查询; 创建唯一约束时,会自动的创建唯一索引;在理论上,不一样,在实际使用时,...

    唯一约束和唯一索引的区别:

    总结到此为止,基本上就能得出,唯一约束和唯一索引在 MySQL 数据库里区别了:

    1. 概念上不同,约束是为了保证数据的完整性,索引是为了辅助查询;
    2. 创建唯一约束时,会自动的创建唯一索引;在理论上,不一样,在实际使用时,基本没有区别。
    3. 关于第2条的why:MySQL 中唯一约束是通过唯一索引实现的,为了保证没有重复值,在插入新记录时会再检索一遍,怎样检索快,当然是建索引了,所以,在创建唯一约束的时候就创建了唯一索引。

    唯一索引和主键索引的区

    不同点

    1. 创建方式上:主键索引是建立在主键之上的索引,当声明表的主键时,数据库会自动为该列的每一条记录建立主键索引,由此形成B+树形式的主键索引树;
    2. 作用上:主键属于索引的一种
    3. 数量上:一个表只能有一个主键索引,但是可以有多个唯一索引
    4. 特性上:主键索引要求被索引的列必须唯一且非空,而唯一索引则允许列值为空,甚至多个列值为空

    相同点:

    1. 类别上:主键索引是唯一索引的特定类型
    2. 构成上:主键可以多个字段组成复合索引,所以主键索引也可以由多个字段组成;唯一索引也可以由多个字段组成
    3. 作用上:使用主键索引和唯一索引都能加快对数据库的检索和提高数据的查询效率

    聚集索引和非聚集索引的区别

    聚集索引(也称聚类索引、簇集索引)

    1. 聚集索引的一个特性存放的物理顺序和列中的排列顺序一样。一般设置一张表中的主键索引就为聚集索引(一张表的主键索引只有一个)。
    2. 一个没加主键的表,它的数据无序的放置在磁盘存储器上,一行一行的排列的很整齐。如果给表上了主键,那么表在磁盘上的存储结构就由整齐排列的顺序结构转变成了树状结构,也就是平衡树结构,换句话说,就是整个表就变成了一个索引,也就是所谓的聚集索引
    3. 这就是为什么一个表只能有一个字段被设置为主键,因为一张表只能对应一个 能指向这张表的指针/索引, 一个表只能有一个聚集索引,因为主键的作用就是把表的存储格式由顺序格式转换成索引(平衡树)的格式。
    4. 聚集索引的叶子节点就是整张表的行记录

    非聚集索引(也称非聚类索引、非簇集索引)

    1. 也称常规索引,非聚集索引和聚集索引一样, 同样是采用平衡树作为索引的数据结构。
    2. 索引树结构中各节点的值来自于表中的索引字段, 假如给user表的name字段加上索引。 那么索引就是由name字段中的值构成,在数据改变时,
    3. DBMS需要一直维护索引结构的正确性。如果给表中多个字段加上索引 , 那么就会出现多个独立的索引结构,每个索引(非聚集索引)互相之间不存在关联。

    非聚集索引和聚集索引的区别在于:

    1. 通过聚集索引可以一次查到需要查找的数据, 而通过非聚集索引第一次只能查到记录对应的主键值 , 再使用主键的值通过聚集索引查找到需要的数据。
    2. 聚集索引一张表只能有一个,而非聚集索引一张表可以有多个。
    3. 聚集索引的叶子节点就是整张表的行记录,而常规索引的叶子节点记录的一张表的部分行记录。
    4. 对于InnoDB来说,聚集索引一般是表中的主键索引,如果表中没有显示指定主键,则会选择表中的第一个不允许为NULL的唯一索引。如果没有主键也没有合适的唯一索引,那么InnoDB内部会生成一个隐藏的主键作为聚集索引,这个隐藏的主键长度为6个字节,它的值会随着数据的插入自增。

    索引的两面性

    然而, 事物都是有两面的,

    • 索引能让数据库查询数据的速度上升, 而使写入数据的速度下降,原因很简单的,因为平衡树这个结构必须一直维持在一个正确的状态, 增删改数据都会改变平衡树各节点中的索引数据内容,破坏树结构, 因此,在每次数据改变时, DBMS必须去重新梳理树(索引)的结构以确保它的正确,这会带来不小的性能开销,也就是为什么索引会给查询以外的操作带来副作用的原因。
    • 每次给字段建一个新索引, 字段中的数据就会被复制一份出来, 用于生成索引。 因此, 给表添加索引,会增加表的体积, 占用磁盘存储空间。
    展开全文
  • 一般,我们看到术语“索引”和“键”交换使用,但实际上这两个是不同的。...推荐阅读:接下来我们看看数据库中的主键约束、唯一键约束和唯一索引区别。SQL> select * from v$version;BANNER----------------...

    一般,我们看到术语“索引”和“键”交换使用,但实际上这两个是不同的。索引是存储在数据库中的一个物理结构,键纯粹是一个逻辑概念。键代表创建来实施业务规则的完整性约束。索引和键的混淆通常是由于数据库使用索引来实施完整性约束。

    推荐阅读:

    接下来我们看看数据库中的主键约束、唯一键约束和唯一索引的区别。

    SQL> select * from v$version;

    BANNER

    --------------------------------------------------------------------------------

    Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

    PL/SQL Release 11.2.0.1.0 - Production

    CORE    11.2.0.1.0      Production

    TNS for Linux: Version 11.2.0.1.0 - Production

    NLSRTL Version 11.2.0.1.0 - Production

    SQL> create table test (

    2  id int,

    3  name varchar2(20),

    4  constraint pk_test primary key(id))

    5  tablespace users;

    Table created.

    SQL> select constraint_name, constraint_type from user_constraints;

    CONSTRAINT_NAME                C

    ------------------------------ -

    PK_TEST                        P

    在test表中,我们指定了ID列作为主键,Oracle数据库会自动创建一个同名的唯一索引:

    SQL> select index_name, index_type, uniqueness, tablespace_name

    2  from user_indexes

    3  where table_owner='SCOTT'

    4  and table_name = 'TEST';

    INDEX_NAME          INDEX_TYPE          UNIQUENES TABLESPACE_NAME

    -------------------- -------------------- --------- ------------------------------

    PK_TEST              NORMAL              UNIQUE    USERS

    此时,如果我们再试图在ID列上创建一个唯一索引,Oracle会报错,因为该列上已经存在一个唯一索引:

    SQL> create unique index idx_test_uk on test(id);

    create unique index idx_test_uk on test(id)

    *

    ERROR at line 1:

    ORA-01408: such column list already indexed

    即使创建非唯一索引也不行:

    SQL> create index idx_test_id on test(id);

    create index idx_test_id on test(id)

    *

    ERROR at line 1:

    ORA-01408: such column list already indexed

    那么唯一键约束的情况是怎样的呢?

    SQL> drop table test purge;

    Table dropped.

    SQL> create table test(

    2  id int,

    3  name varchar2(20),

    4  constraint uk_test unique(id));

    Table created.

    SQL> select constraint_name, constraint_type from user_constraints;

    CONSTRAINT_NAME                C

    ------------------------------ -

    UK_TEST                        U

    查看此时的索引情况:

    SQL> select index_name, index_type, uniqueness, tablespace_name

    2  from user_indexes

    3  where table_owner='SCOTT'

    4  and table_name = 'TEST';

    INDEX_NAME          INDEX_TYPE          UNIQUENES TABLESPACE_NAME

    -------------------- -------------------- --------- ------------------------------

    UK_TEST              NORMAL              UNIQUE    USERS

    Oracle同样自动创建了一个同名的唯一索引,而且也不允许再在此列上创建唯一索引或非唯一索引。

    我们知道,主键约束要求列值非空(NOT NULL),那么唯一键约束是否也要求非空呢?

    SQL> insert into test values(1, 'Sally');

    1 row created.

    SQL> insert into test values(null, 'Tony');

    1 row created.

    SQL> insert into test values(null, 'Jack');

    1 row created.

    SQL> select * from test;

    ID NAME

    ---------- --------------------

    1 Sally

    Tony

    Jack

    从实验结果来看,唯一键约束并没有非空要求。

    接下来我们看看唯一索引对列值的非空要求有什么不同。

    SQL> drop table test purge;

    Table dropped.

    SQL> create table test(

    2  id int,

    3  name varchar2(20));

    Table created.

    SQL> create unique index idx_test_id on test (id);

    Index created.

    SQL> insert into test values(1, 'Sally');

    1 row created.

    SQL> insert into test values(null, 'Tony');

    1 row created.

    SQL> insert into test values(null, 'Jack');

    1 row created.

    SQL> select * from test;

    ID NAME

    ---------- --------------------

    1 Sally

    Tony

    Jack

    通过实验,我们看出唯一索引与唯一键约束一样对列值非空不做要求。

    0b1331709591d260c1c78e86d0c51c18.png

    展开全文
  • 主键与索引的区别如下: 主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。 主键创建后一定包含一个...主键唯一索引区别 二、区别 主键是一种约束,目的是对这个表的某一列进行限制; 唯一索引是一种
  • 主键唯一索引区别

    千次阅读 2021-01-18 19:21:09
    前言:作为一个非开发出身的DBA刚开始对数据库的主键、外键等一系列的词很是困惑,到后面对主键(primary key)和唯一索引(Unique Index)又迷糊了很久,后面终于陆续整理清楚了,总结和大家分享下;一、相似之处创建...
  • 主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。 主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。 唯一性索引列允许空值,而主键列不允许为空值。 主键列在创建时,已经默认为非空值 ...
  • 简单描述MySQL中,索引,主键唯一索引,联合索引 的区别,对数据库的性能有什么影响 索引是一种特殊的文件(InnoDB 数据表上的索引是表空间的一个组成部分),它们 包含着对数据表里所有记录的引用指针。 普通索引...
  • MySQL主键索引和唯一索引区别 什么是最左前缀原则? 以下回答全部是基于MySQL的InnoDB引擎 例如对于下面这一张表 如果我们按照 name 字段来建立索引的话,采用B+树的结构,大概的索引结构如下 如果我们要进行...
  • 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。 索引的一个主要目的就是加快检索表中数据,亦即能协助信息搜索者尽快的找到符合限制条件的记录ID的辅助数据结构。 ...
  • 下面是主键索引的一些区别与联系。 1. 主键一定是唯一索引唯一索引并不一定就是主键。 所谓主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引。因为主键可以唯一...
  • 1.主键是一种约束,唯一索引是一种索引,两者在本质上是不同的;2.一张表只能有一个主键,但可以创建多个唯一索引;3.主键创建后一定包含一个唯一索引唯一索引并一定是主键;4.主键不能为null,唯一索引可以为null...
  • 主键唯一索引都要求值唯一,但是它们还是有区别的: 主键是一种约束,唯一索引是一种索引 一张表只能有一个主键,但可以创建多个唯一索引 主键创建后一定包含一个唯一索引唯一索引并一定是主键 主键不能为...
  • 索引是一种特殊的文件(InnoDB数据表上的...如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。也就是说,唯一索引可以保证数据记录的唯一...
  • 主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。唯一性索引列允许空值,而主键列不允许为空值。主键列在创建时,已经默认为非空值 + ...
  • 主键和复合主键 一个表中可以存在一个主键或者多个主键,都...主键索引和唯一索引 相同点:都起到了约束数据记录唯一性的作用 不同点: 主键是一种约束,而唯一索引是索引,他们本质不一样 主键创建之后一定包含着...
  • 普通索引 这是最基本的索引,它没有任何限制。它有以下几种创建方式: (1)直接创建索引 CREATE INDEX index_name ON table(column(length)) (2)修改表结构的方式添加索引 ALTER TABLE table_name ADD INDEX ...
  • 一、 创建主键(主键=主键索引=聚集索引) 主键是什么? 答:拿主键可以唯一确定一条数据,它和物理存储排序一致,不能为空,一个表只能有一个。 原本没有创建的主键的表在磁盘上存储为: Id=0;username=username0;sex...
  • Oracle主键、唯一键与唯一索引区别一般,我们看到术语“索引”和“键”交换使用,但实际上这两个是不同的。索引是存储在中的一个物理结构,键纯粹是一个逻辑概念。键代表创建来实施业务规则的完整性约束。索引和键...
  • ... 索引是一种特殊的文件,它们包含着对所有记录的引用指针。索引可以极大地提高数据查询速度,但是会降低插入删除更新表的速度,因为在执行这些操作是,还要操作索引文件用来维护,所以说索引不是建的越多...
  • 主键唯一索引区别

    千次阅读 2019-03-06 15:06:02
    1.主键为一种约束,唯一索引为一种索引,本质上就不同; 2.主键创建后一定包含唯一性索引,而唯一索引不一定就是主键; 3.主键不允许空值,唯一索引可以为空; 4.主键可以被其他表引用,而唯一索引不可以; 5.一个表...
  • 唯一索引主键索引区别: 一个表只能有一个主键索引,但是可以有多个唯一索引 主键索引一定是唯一索引唯一索引则不一定是主键索引 主键索引可以外键构成完整性约束,唯一索引不可以 唯一性索引列允许空值,而...
  • (转)仅供自己学习,特此记录Mysql索引概念:说说Mysql索引,看到一个很少比如:索引就好比一本书的目录,它会让你更快的找到内容,显然目录(索引)并不是越多越好,假如这本书1000页,有500也是目录,它当然效率低,...
  • 主键索引:唯一切不为...唯一索引:唯一可为null;唯一约束放在一 个或者多个列上,这些列或列的组合必须有唯一的;创建唯一性的非聚簇索引,但是,也可以指定所创建的索|是聚簇索引。 转载于:https://www.cnblo...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 182,711
精华内容 73,084
关键字:

唯一索引与主键的区别