精华内容
下载资源
问答
  • 外键:是关联另外一个表主键的一个键,保证两个表之间的关联性索引:加快搜索效率 为什么主键只有一个?因为主键起始从实现角度来看是一个 唯一 非空 聚类索引, 聚类索引一个表中只有一个,所以主键只有一个。...

    主键:保证数据完整唯一性。

    外键:是关联另外一个表主键的一个键,保证两个表之间的关联性

    索引:加快搜索效率

     

    为什么主键只有一个?

    因为主键起始从实现角度来看是一个   唯一 非空 聚类索引, 聚类索引在一个表中只有一个,所以主键只有一个。至于为什么聚类索引在一个表中只有一个是因为聚类索引表的数据物理顺序和索引排序方式一致,而物理存储方式只有一种,所以聚类索引在一个表中只有一种,详细情况请查看聚类索引。

     

    主键与索引的关系是什么?

    首先主键和索引从目的上来讲不是一个概念,主键是为了保证数据唯一性,索引是为了加快检索速度。但是,从实现方式上主键主键却达到了唯一 非空聚类索引的效果。所以

    1. 从实现目的来看(约束)

       主键约束=唯一非空 约束

    2. 从实现效果来看

       主键 = 唯一

     

    主键外键的关系?

     

       外键(Foreign Key)

      如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。外键又称作外关键字。

      外键的作用:

      保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值!

      例如:

      a b 两个表

      a表中存有客户号,客户名称

      b表中存有每个客户的订单

      有了外键后

      你只能在确信b 表中没有客户x的订单后,才可以在a表中删除客户x

      建立外键的前提: 本表的列必须与外键类型相同(外键必须是外表主键)。

      指定主键关键字: foreign key(列名)

      引用外键关键字: references <外键表名>(外键列名)

      事件触发限制: on delete和on update , 可设参数cascade(跟随外键改动), restrict(限制外表中的外键改动),set Null(设空值),set Default(设默认值),[默认]no action

      例如:

      outTable表 主键 id 类型 int

      创建含有外键的表:

      create table temp(

      id int,

      name char(20),

      foreign key(id) references outTable(id) on delete cascade on update cascade);

      说明:把id列 设为外键 参照外表outTable的id列 当外键的值删除 本表中对应的列筛除 当外键的值改变 本表中对应的列值改变。

      建键几个原则:

      1、 为关联字段创建外键。

      2、 所有的键都必须唯一。

      3、避免使用复合键。

      4、外键总是关联唯一的键字段。

    展开全文
  • 聚集索引: 按照每张主键构造B+树,中间节点用来存放索引,叶子节点(数据页)用来存放行的全部数据,按照主键的顺序排序,每个数据页都通过一个双向链表来连接,因此,聚集索引能够在B+树索引的叶子节点上直接...

    聚簇索引和非聚簇索引(主键索引和非主键索引)

    • 主键索引也被称为聚簇索引。
    • 聚簇索引: 聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。聚簇索引将索引和数据行放到了一块,找到索引也就找到了数据。因为无需进行回表操作,所以效率很高。
      • 回表查询:InnoDB 中,对于主键索引,只需要走一遍主键索引的查询就能在叶子节点拿到数据。而对于普通索引,叶子节点存储的是 key + 主键值,因此需要再走一次主键索引,通过主键索引找到行记录,这就是所谓的回表查询,先定位主键值,再定位行记录
    • InnoDB中必然且只会有一个聚集索引,一般是主键,如果没有主键,就会优先选择非空的唯一索引,如果唯一索引页没有,就会创建一个隐藏的 row_id 作为聚集索引。
      • 优点:由于它将索引和数据保存在同一个B+树中,所以查找效率高,又由于叶子节点间双向链表的存在,是它对主键的排序查找和范围查找速度也非常快;
      • 缺点:对表进行修改的速度较慢,因为为了保证表中记录的物理顺序和索引的顺序一致,会把记录插到数据页(叶子节点)的相应位置,所以会产生数据重排,而且插入新记录时为了维持B+树的特性,会频繁的分裂调整,影响了整体插入效率。
      • 所以建议使用聚簇索引的场景是需要进行排序或范围查找的场景,比如实现电子邮箱获取用户邮件时,如果不使用聚簇索引,则每封邮件都可能产生一次磁盘IO,如果采用聚簇索引,根据用户ID来聚集数据,那么只需要从磁盘读取少量的数据页就可以获得某个用户全部的邮件了。(where id > #{maxId})
        (聚簇索引的存储不是物理上连续的,而是逻辑上连续的,这样可以降低维护成本。每张表只能有一个聚簇索引,因为数据页只能按照一棵B+树来排序)
    • 非聚簇索引(非主键索引) :它将数据存储和索引分开,找到索引后,需要通过对应的地址找到对应的数据行。MyISAM 的索引方式就是非聚簇索引。
      • 缺点:当通过非聚簇索引来查找数据时,首先遍历找到对应的叶子节点,也就找到了聚簇索引的主键,然后通过聚簇索引找到对应的数据。所以它需要两次索引查找,效率相对较低,这是它的。
      • 优点:插入记录时不会引起数据顺序的重组。所以建议使用非聚簇索引的场景是频繁更新的列。

    走普通索引,一定会出现回表查询吗?

    不一定,如果查询语句所要求的字段全部命中了索引,那么就不必再进行回表查询就能拿到所有的请求数据。
    很容易理解,有一个 user 表,主键为 id,name 为普通索引,则再执行:select id, name from user where name = ‘joonwhee’ 时,通过name 的索引就能拿到 id 和 name了,因此无需再回表去查数据行了。

    展开全文
  • 聚簇索引和非聚簇索引(主键索引和非主键...而对于普通索引,叶子节点存储的是 key + 主键值,因此需要再走主键索引,通过主键索引找到行记录,这就是所谓的回查询,先定位主键值,再定位行记录。 InnoDB中.

    聚簇索引和非聚簇索引(主键索引和非主键索引)

    • 主键索引也被称为聚簇索引。
    • 聚簇索引: 聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。聚簇索引将索引和数据行放到了一块,找到索引也就找到了数据。因为无需进行回表操作,所以效率很高。
      • 回表查询:InnoDB 中,对于主键索引,只需要走一遍主键索引的查询就能在叶子节点拿到数据。而对于普通索引,叶子节点存储的是 key + 主键值,因此需要再走一次主键索引,通过主键索引找到行记录,这就是所谓的回表查询,先定位主键值,再定位行记录
    • InnoDB中必然且只会有一个聚集索引,一般是主键,如果没有主键,就会优先选择非空的唯一索引,如果唯一索引页没有,就会创建一个隐藏的 row_id 作为聚集索引。
      • 优点:由于它将索引和数据保存在同一个B+树中,所以查找效率高,又由于叶子节点间双向链表的存在,是它对主键的排序查找和范围查找速度也非常快;
      • 缺点:对表进行修改的速度较慢,因为为了保证表中记录的物理顺序和索引的顺序一致,会把记录插到数据页(叶子节点)的相应位置,所以会产生数据重排,而且插入新记录时为了维持B+树的特性,会频繁的分裂调整,影响了整体插入效率。
      • 所以建议使用聚簇索引的场景是需要进行排序或范围查找的场景,比如实现电子邮箱获取用户邮件时,如果不使用聚簇索引,则每封邮件都可能产生一次磁盘IO,如果采用聚簇索引,根据用户ID来聚集数据,那么只需要从磁盘读取少量的数据页就可以获得某个用户全部的邮件了。(where id > #{maxId})
        (聚簇索引的存储不是物理上连续的,而是逻辑上连续的,这样可以降低维护成本。每张表只能有一个聚簇索引,因为数据页只能按照一棵B+树来排序)
    • 非聚簇索引(非主键索引) :它将数据存储和索引分开,找到索引后,需要通过对应的地址找到对应的数据行。MyISAM 的索引方式就是非聚簇索引。
      • 缺点:当通过非聚簇索引来查找数据时,首先遍历找到对应的叶子节点,也就找到了聚簇索引的主键,然后通过聚簇索引找到对应的数据。所以它需要两次索引查找,效率相对较低,这是它的。
      • 优点:插入记录时不会引起数据顺序的重组。所以建议使用非聚簇索引的场景是频繁更新的列。

    走普通索引,一定会出现回表查询吗?

    不一定,如果查询语句所要求的字段全部命中了索引,那么就不必再进行回表查询就能拿到所有的请求数据。
    很容易理解,有一个 user 表,主键为 id,name 为普通索引,则再执行:select id, name from user where name = ‘joonwhee’ 时,通过name 的索引就能拿到 id 和 name了,因此无需再回表去查数据行了。

    展开全文
  • 一个表最多只能创建一个主键,但可以创建多个唯一索引主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等。 主键和唯一索引的区别 二、区别 主键是一种约束,目的是对这个表的某一列进行限制; ...

    主键与索引的区别如下:
    主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。
    主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。
    唯一性索引列允许空值,而主键列不允许为空值。
    主键列在创建时,已经默认不为空值 + 唯一索引了。
    主键可以被其他表引用为外键,而唯一索引不能。
    一个表最多只能创建一个主键,但可以创建多个唯一索引。
    主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等。

    主键和唯一索引的区别

    二、区别

    主键是一种约束,目的是对这个表的某一列进行限制;
    唯一索引是一种索引,索引是数据库表的一个冗余结构,目的是为了更好的查询;
    主键列不允许为空值,而唯一性索引列允许空值;
    一个表最多只能一个主键,但是可以包含多个唯一索引;
     

    1、一个表中可以有多个唯一索引,但是只能有一个主键。

    2、主键一定是唯一性索引,唯一性索引并不一定就是主键

    主键不允许为空,唯一键允许为空,空值不受唯一约束,也就是说可以有多个空值。

    注:可以多列组合成一个唯一索引或者一个主键,即组合索引或组合主键
    ————————————————
     


    建立索引常用的规则如下:
    1、表的主键、外键必须有索引;
    2、数据量超过300的表应该有索引;
    3、经常与其他表进行连接的表,在连接字段上应该建立索引;
    4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
    5、索引应该建在选择性高的字段上;
    6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
    7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
    8、频繁进行数据操作的表,不要建立太多的索引;
    9、删除无用的索引,避免对执行计划造成负面影响;

    展开全文
  • 一个表中可以存在一个主键或者多个主键,都是起到唯一约束的作用;查了相关资料,还了解到,复合主键和联合主键的区别,只是看是来源于单表(复合主键),还是来源于多表(联合主键);在我看来其实都一样,只是概念...
  • 主键索引和唯一索引的区别

    万次阅读 2018-07-18 10:03:18
    -- 区别 主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。...一个表最多只能创建一个主键,但可以创建多个唯一索引主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等。 在...
  • 一个表只能有一个主键,但可以有多个候选索引主键常常与外键构成参照完整性约束,防止出现数据不一致。主键可以保证记录的唯一和主键域非空,数据库管理系统对于主键自动生成唯一索引,所以主键也是一个特殊的索引...
  • 主键索引是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。一般是在建表的时候同时添加主键索引; 一、如何添加主键索引 修改表添加主键索引 Alter table 表名 add primary key(列名) 例 修改 ...
  • 一个表里只能一个主键索引,普通索引可以有多个。 #Oracle创建普通索引 CREATE INDEX index_emp_deptno ON emp_test(deptno); #Oracle删除普通索引 drop INDEX index_emp_deptno ; #Oracle创建主键索引 ALTER ...
  • MySQL索引之主键索引

    2017-03-22 17:53:09
    导读 在MySQL里,主键索引和辅助索引分别是什么意思,有什么区别? ...上次的分享我们介绍了聚集索引和非聚集索引的区别,本次我们...一个表可以没有主键,但最多只能有一个主键,并且主键值不能包含NULL。 在M
  • 单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索包含多个列。 MySQL索引类型包括: 一、普通索引 这是最基本的索引,它没有任何限制。它有以下几种创建方式...
  • 一张只能一个主键索引 普通索引: 用来加速数据访问速度而建立的索引。多建立在经常出现在查询条件的字段和经常用于排序的字段。 被索引的数据列允许包含重复的值 唯一索引: 被索引的数据列不允许包含...
  • MYSQL 索引 主键 外键

    2017-05-14 18:51:29
    MYSQL 索引 主键 外键解释: 索引可分为普通索引和唯一索引,主要...主键具有唯一索引的特性,用于唯一标识记录,一个表只能一个主键; 外键具有普通索引的的特性,是关联表的主键,用于多表级联,维护多表数据一致性。
  • 作用:用来保证数据完整性个数:主键只能有一个索引:作用:是提高查询排序的速度个数:一个表可以有多个索引常用索引类型:Non-unique(非唯一索引,常用)Unique(唯一索引,该字段没有重复值,但可以有一个空值)...
  • 一般创建表都会以主键建立索引,每个主键就是树的一个节点,节点上的分之或者说树叉就是中一行数据的其他字段数据。如果查询其他字段数据,一般需要先找到主键节点,然后再查询对应的树叉数据。这就叫回。 如果...
  • 普通索引 最基本的索引类型,没有唯一性之类的限制。普通索引可以通过以下几种方式创建创建索引,例如CREATE INDEX ON tablename...创建表的时候指定索引,例如CREATE TABLE tablename ( [...], INDEX [索引的名字
  • 浅谈主键索引与唯一索引

    千次阅读 2017-11-16 18:57:38
    在数据库关系图中为定义一个主键将自动创建主键索引主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的。当在查询中使用主键索引时,它还允许快速访问数据。 它们的一些比较: (1)对于主健/...
  • mysql主键索引、非主键索引、联合索引、覆盖索引、最左匹配、索引下推
  • 主键索引就是聚簇索引,每张有且只能一个主键,可以由一个或多个字段组成。 主键索引的三个条件:1.主键键值必须是唯一2.不能含有null值3.保证主键是自增的 自增列作主键可以使写入的顺序也是自增的,这个可以...
  • 外键必须是另一个表主键

    千次阅读 2019-03-01 14:48:49
    不一定是主键,但必须是唯一性索引主键约束和唯一性约束都是唯一性索引。 FOREIGN KEY 约束 ...在外键引用中,当一个表的列被引用作为另一个表的主键值的列时,就在两表之间创建了链接。这...
  • 数据库索引主键

    2016-06-20 09:16:46
    主键和唯一索引的区别:  主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。  主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。  唯一性索引列允许空值,而... 一个表最多只能创建
  • 唯一索引主键

    2016-05-27 19:39:55
    区别主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。主键创建后一定包含一个...一个表最多只能创建一个主键,但可以创建多个唯一索引主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等。
  • 主键索引

    2015-04-13 20:32:28
    3、表建立主键时,在列上自动建立一个唯一性索引; 4、主键可以是列级约束,也可以是级约束。 二、索引 索引是一种可选的与相关的数据库对象,用于提高数据的查询效率。索引是建立在列上的数据库对象,但...
  • MySQL索引主键和唯一性的区别

    千次阅读 2017-07-26 11:23:33
    PRIMARY 主键: 就是 唯一 且 不能为空。 INDEX 索引: 普通的 UNIQUE 唯一索引: 不允许有重复。...在一张只能定义一个主键索引,使用关键字 PRIMARY KEY 来创建。 2.索引(INDEX ):
  • 主键、聚集索引、非聚集索引区别

    千次阅读 2020-07-14 10:59:36
    一个表最多一个聚集索引 是否允许多个字段来定义 一个主键可以多个字段来定义 一个索引可以多个字段来定义 是否允许 null 数据行出现 如果要创建的数据列中数据存在null,无法建立主键。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 104,736
精华内容 41,894
关键字:

一个表只能创建一个主键索引