精华内容
下载资源
问答
  • 业务无关的自增id作为数据库主键: 1、可以反过来思考,若使用业务相关的唯一标识做...在B+树的数据结构中叶子节点存储数据,如果没定义主键,则会使用非空且唯一的字段,默认为作为主键,如果前面两者都不存在则...

    业务无关的自增id作为数据库主键

    一、自增id必要性

    1、若使用业务相关的唯一标识做主键,小概率可能会因为业务场景的变更,此时的被认定为业务唯一标识的字段不唯一。

    2、对于InnoDB来说,主键索引是聚簇索引,叶子节点存储主键索引行记录。自增主键索引新增行记录在最后一个叶子节点页尾部插入,是顺序写磁盘;而非自增主键索引将产生页的重排分裂和频繁随机io写磁盘,降低数据行写入效率。

    3、对大表做遍历,一次读取数据条数不宜过多,避免大数据直接进入老年代、导致fullgc。涉及深分页可以基于顺序唯一索引做排序,基于上一次查找的最后一条记录索引值
    查找下一批次记录行。

    二、不指定主键索引

    如果没定义主键,则会使用非空且唯一的字段,默认为作为主键。不存在则使用内置全局6个字节长度的行标ROWID作为主键。

    三、b+树三层索引存储千万行记录数据

    InnoDB使用b+树,原因是数据持久到磁盘存储。为了避免频繁的磁盘io,导致内存读取磁盘页的频繁换出,大大降低计算性能。使用b+树存储千万数据仅需做3次磁盘io。

    具体分析

    1、操作系统都是按页读取磁盘到内存,从一定程度上可以把内存页看作是磁盘数据的缓存。innodb默认一次读取磁盘数据页大小16kb。
    2、假设一个索引项构成:主键数据(8byte)+指针(6byte,64位操作系统其中低48位做指针、而高16位预留。GC垃圾回收器,低停顿的垃圾回收 染色),那么一个索引项需要14byte。16kb至少可以存1000索引项。那么b+树二层非叶子节点索引可存10001000=100w索引项。
    3、假设一行记录占用空间1kb,16kb则可以存储16行数据。那么3层b+树索引(两层存储索引项、一层存储行数据),可以存储100w
    16=1600w数据行,即3次磁盘io即可找到目标数据行。

    展开全文
  • 什么是联合主键

    千次阅读 2019-07-20 13:33:10
    用这个主键包含的字段作为主键,这个组合在数据表中是唯一,且加了主键索引。 可以这么理解,比如,你的订单表里有很多字段,一般情况只要有个订单号bill_no做主键就可以了,但是,现在要求可能会有补 充订单,使用...

    联合主键就是用2个或2个以上的字段组成主键。
    用这个主键包含的字段作为主键,这个组合在数据表中是唯一,且加了主键索引。
    可以这么理解,比如,你的订单表里有很多字段,一般情况只要有个订单号bill_no做主键就可以了,但是,现在要求可能会有补 充订单,使用相同的订单号,
    那么这时单独使用订单号就不可以了,因为会有重复。那么你可以再使用个订单序列号bill_seq来 作为区别。把bill_no和bill_seq设成联合主键。
    即使bill_no相同,bill_seq不同也是可以的。
    alter table 表 add constraint pk_name primary key (列1,列2,…)
    联合主键的好处是不需要因为需要主键而增加一个无用的主键列
    例如如果不用联合主键你必须增加个列ID设置主键
    但这个ID列 无任何作用 至于在什么情况下使用,就像刚才举例的,当你这个表的主键ID无任何用处,那么就用联合主键好了,
    你可以节约 一个列的空间,但如果这表的ID列要做为别的表的外键的话,就不能用联合主键了。
    联合主键就是确定一条记录的唯一性啊
    比如这种时候
    商品品牌 商品型号
    诺基亚 920
    三星 NOTE2
    诺基亚 8088
    比如这样商品品牌可能有重复,都是诺基亚,但是诺基亚厂商生产的商品型号是不会重复的 也比如,可能好多品牌都有920这个型号,但是一个品牌只有一个920的型号
    所以就靠这样的联合主键来确定这条记录的唯一性
    建立方法如下
    create table product( pro_name varchar(20), pro_type varchar(20), primary key (pro_name,pro_type) );

    展开全文
  • 什么是复合主键

    2019-02-26 10:17:00
    主键是唯一的索引,通常会用GUID最为主键,但是并不是每个表都存在ID字段,例如学生表(姓名,生日,性别,班级),这里面每一个值都可能重复,无法使用单一字段作为主键,这时我们可以将多个字段设置为复合主键,由...

      主键是唯一的索引,通常会用GUID最为主键,但是并不是每个表都存在ID字段,例如学生表(姓名,生日,性别,班级),这里面每一个值都可能重复,无法使用单一字段作为主键,这时我们可以将多个字段设置为复合主键,由复合主键标识唯一性。只要不是复合主键每个值都重复,就不算重复。

    create table student 
    ( 
       name varchar(16), 
       birth date, 
       sex bool, 
       class int,
       primary key (name,birth,sex,class) 
    )

    转载于:https://www.cnblogs.com/stilldream/p/10435628.html

    展开全文
  • 联合主键什么用?

    2019-09-30 09:49:28
    用这个主键包含的字段作为主键,这个组合在数据表中是唯一,且加了主键索引。 可以这么理解,比如,你的订单表里有很多字段,一般情况只要有个订单号bill_no做主键就可以了,但是,现在要求可能会有补 充订单,使用...
    联合主键就是用2个或2个以上的字段组成主键
    用这个主键包含的字段作为主键,这个组合在数据表中是唯一,且加了主键索引。
    可以这么理解,比如,你的订单表里有很多字段,一般情况只要有个订单号bill_no做主键就可以了,但是,现在要求可能会有补 充订单,使用相同的订单号,
    那么这时单独使用订单号就不可以了,因为会有重复。那么你可以再使用个订单序列号bill_seq来 作为区别。把bill_no和bill_seq设成联合主键。
    即使bill_no相同,bill_seq不同也是可以的。
    alter table 表 add constraint pk_name primary key (列1,列2,...)
    联合主键的好处是不需要因为需要主键而增加一个无用的主键列
    例如如果不用联合主键你必须增加个列ID设置主键
    但这个ID列 无任何作用 至于在什么情况下使用,就像刚才举例的,当你这个表的主键ID无任何用处,那么就用联合主键好了,
    你可以节约 一个列的空间,但如果这表的ID列要做为别的表的外键的话,就不能用联合主键了。
    联合主键就是确定一条记录的唯一性啊   
    比如这种时候
    商品品牌 商品型号
    诺基亚 920
    三星 NOTE2
    诺基亚 8088
    比如这样商品品牌可能有重复,都是诺基亚,但是诺基亚厂商生产的商品型号是不会重复的 也比如,可能好多品牌都有920这个型号,但是一个品牌只有一个920的型号
    所以就靠这样的联合主键来确定这条记录的唯一性
    建立方法如下
    create table product( pro_name varchar(20), pro_type varchar(20), primary key (pro_name,pro_type) );

    转载于:https://www.cnblogs.com/UniqueColor/p/7234340.html

    展开全文
  • 1.InnoDB存储引擎的数据结构必须需要一个主键才可以组织起来,如果用户使用InnoDB存储引擎建立表的时候,没有指定主键,则Mysql会自动的帮你找到一个合适的唯一索引作为主键,若找不到符合条件唯一索引条件的字段时...
  • 经常看到有帖子或博客讨论主键选择问题,有人建议使用业务无关的自增主键,有人觉得没有必要,完全可以使用如学号或身份证号这种唯一字段作为主键。不论支持哪种论点,大多数论据都是业务层面的。如...
  • 主键可以作为一张表的唯一标志物 外键:表示该XX 来自 何处 列:也叫字段或者属性(一列) 行:字段的组合,称为记录或者元组(一行) 外键设置方法: 点击关系——常规后面的省略号——选择设置外键 ...
  • 主键和外键

    千次阅读 2019-01-08 09:01:10
    则学号可以作为主键 省份证(身份证号,姓名,生日年月) 则身份证号可以作为主键 外键:关系型数据库中,外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。 例如: A表中的一个字段,是B表的...
  • sql 主键 外键

    2019-08-07 11:58:40
    主键:一个关系表,一行数据可以唯一的标识这张表,不使用任何与业务相关的字段作为主键,基本上都是全局唯一GUID类型,自增id什么的来做主键。 外键:外键是定义的 class表 id name 1 一班 ...
  • SQL教程(二):主键

    2020-09-03 08:25:12
    例如:假设将姓名作为主键,那么任意两台记录只需名字不同即可,其他什么字段身高、性别……可以相同 主键定义:唯一定位记录的字段 一旦插入表中最好不要修改 【1】主键选取原则 不能选择任何业务相关的字段...
  • 联合主键索引问题

    千次阅读 2019-08-05 14:59:27
    字段a、b、c作为联合主键,每个主键字段什么情况下可以使用索引? 测试环境 mysql8.0.15 InnoDB引擎 测试过程 建立个user表,具体信息如下: user表信息如下: 上表中对id,age,sum这个三个字段设定...
  • MySQL索引之主键索引

    2020-12-15 16:43:01
    在MySQL里,主键索引和...1、采用一个没有业务用途的自增属性列作为主键; 2、主键字段值总是不更新,只有新增或者删除两种操作; 3、不选择会动态更新的类型,比如当前时间戳等。 这么做的好处有几点: 1、新增数据
  • 主键查询和设置(postgres )

    千次阅读 2017-08-01 17:48:13
    今天库里需要建一张新表,需要三个字段联合作为主键。在Navicat里是可以通过点击最后一栏设置主键的。 但是我心想,一张表只有一个主键,这个1,2,3表示的是啥啊?心里有点担心的自己的主键有没有设置成功,就查...
  • 数据库主键方案

    2014-01-16 17:12:36
    1、坚决不可以用某个业务字段做主键,理由就不说了,业务都是有意义的,你能...3、GUID作为主键,mysql本身并没有这个数据类型,oracle和sql server都有,它的缺点为:1、存储空间比自增型大很多;2、主键在这上面...
  • 今天库里需要建一张新表,需要三个字段联合作为主键。在Navicat里是可以通过点击最后一栏设置主键的。 但是我心想,一张表只有一个主键,这个1,2,3表示的是啥啊?心里有点担心的自己的主键有没有设置成功,就查了...
  • Sqlite 主键自动创建

    2016-09-21 20:40:40
    每个表都有一个自己的整形id值作为主键,其实可以不指定这么一个id值,sqlite内部本来就会为每个表加上一个 rowid,这个rowid可以当成一个隐含的字段使用,但是由sqlite引擎来维护的,在3.0以前rowid是32位的整数,...
  • 采用一个没有业务用途的自增属性列作为主键; 主键字段值总是不更新,只有新增或者删除两种操作; 不选择会动态更新的类型,比如当前时间戳等。 这么做的好处有几点: 新增数据时,由于主键值是顺序增长的,innodb ...
  • 1.主键和rowid的简单解释 主键:主键是唯一且不为空的,用以标识唯一一条记录。 rowid:就是数据的实际物理地址,rowid没必要自己创建,用户也没有权限创建rowid,它是...个人体验上觉得,rowid既然可以作为主键使用
  • SQLServer中有五种约束,Primary Key约束、Foreign Key约束、Unique约束、Default约束和...就像我们区别不同的人,每个人都有名字,但它却不能作为主键,因为人名很容易出现重复,而身份证号是每个人都不同的,所以
  • 复合主键: ...为什么自增长ID已经可以作为唯一标识的主键,为啥还需要复合主键呢? 因为,并不是所有的表都要有ID这个字段,比如,我们建一个学生表,没有唯一能标识学生的ID,怎么办呢,学生...
  • 如何修改数据库主键

    千次阅读 2005-10-14 00:27:00
    某张表A定义了一个主键比如字段名为Name,该字段作为另外一张表B的外部关键字,以前系统中是不能修改表A的主键的,现在有一特殊的要求,在不变更以前数据库表结构的情况下需要能够修改表A的主键,请问有什么变通的...
  • 主键、外键、唯一、约束区别

    千次阅读 2010-11-24 23:13:00
    什么是主键? <br />在数据库中,常常不只是一个表,这些表之间也不是相互独立的。不同的表之间需要建立一种关系,才能将它们的...数据库的表中作为主键字段就要像人的身份证号一样,必须是每个记录的值

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 201
精华内容 80
关键字:

什么字段可以作为主键