精华内容
下载资源
问答
  • 索引优点(1):保证数据唯一性

    千次阅读 2018-01-22 15:34:43
    这2种是比较特别的索引,可以保证数据唯一性。 主键索引,其实就是在建表时,指定主键,可以是1个字段,也可以是多个字段的组合,但不管怎样,都不能重复,而且也不能是NULL。 唯一索引,和主键索引很相似,...

    索引的第一个优点是保证数据的唯一性。


    (1)准确来说,要保证数据的唯一性,这里特指主键索引、唯一索引。

    这2种是比较特别的索引,可以保证数据的唯一性。


    主键索引,其实就是在建表时,指定主键,可以是1个字段,也可以是多个字段的组合,但不管怎样,都不能重复,而且也不能是NULL。

    唯一索引,和主键索引很相似,区别在于唯一索引的字段,可以包含NULL,由于NULL <> NULL,所以,当插入多个NULL值时,也不会报错。


    (2)主键索引、唯一索引,就是B树索引。

    这2种索引,和给一个字段建个索引,没有本质区别,生成的都是B树索引,区别只是字段的值是否可以重复。


    (3)保证数据唯一性的速度

    因为要保证数据的唯一性,所以,在每次插入数据时,会去表里查找,这个值是否已经存在,如果存在,就会报错,不存在,就可以插入。

    而索引本身就是用来加快查找的,这就保证了这个过程会很快的完成,当往表里插入大量数据的时候,这种速度的优越性就体现出来了。

    展开全文
  • 保证数据记录的唯一性;实现表与表之间的参照完整性;在使用group by order by子句进行数据检索时,利用索引可以减少排序和分组的时间; 注意:一个表最多可以有16个索引;可以由单个字段创建索引,也可以在多个字段...

    42b6d9e7bfd764a34af3554fd45c3b8a.png

    一、索引的作用:
    快速读取数据;
    保证数据记录的唯一性;
    实现表与表之间的参照完整性;
    在使用group by order by子句进行数据检索时,利用索引可以减少排序和分组的时间; 注意:
    一个表最多可以有16个索引;
    可以由单个字段创建索引,也可以在多个字段的组合上创建索引,最多不超过15个字段。 二、索引的分类: 按B-树形式存储的主要索引的分类: 1、普通索引(index)没有唯一性要求; 2、唯一索引(unique)必须具有唯一性; 3、主键(primary key)是一种唯一性索引,可以通过修改表的方式加入主键,但每个只能有一个主键。 三、索引的利弊: 1、索引可加快查询的速度(利) 2、索引会增大表文件的容量(弊) 3、在更新含有索引列的数据时,由于索引也要更新,所以会降低添加、删除、修改和其他写入操作的效率(弊) 四、创建索引 1、在创建表时指定索引: 例:在当前数据库创建一个xs表,包含学号、姓名、身份证三个字段,要求: 学号为主索引、姓名为普通索引、sfz为唯一索引: Create table if not exists xs( 学号 char(6) not null primary key, 姓名 char(4),身份证 char(18), Index xm_xs(姓名), Unique index sfz_xs(身份证)); 2、为已建好的表添加索引: 2.1使用create index语句创建索引 使用create index语句可以在一个已创建好的表上创建索引,一个表可以创建多个索引。 2.2创建命令: Create [unique] index index_name On tb_name(col_name); Create index 索引名 on 表名(字段名) 注意:此命令语句不能创建主索引,创建索引时必须为它取名。 例:为xsl表的姓名字段创建一个名为xm_xsl的索引索引,并查看 Create index xm_xsl on xsl(姓名); Desc xsl; 可以使用整个字段作为索引,也可以使用字段的一部分作为一个索引; 例2:使用xs表的学号前3位数字,创建一个索引xh_xsl,并查看 Create index xh_xsl on xsl (学号(3)); Show index from xsl; 五、使用alter table语句添加索引 由两个以上的字段组合而成的索引叫复合索引。 Alter table tb_name add index In_name(index_xol_name,………) 例:在xs表中,为学号添加一个主索引,为出生日期和姓名添加一个复合索引mark,并查看 Create table xs6 as select * from xsl; Alter table xs6 Add primary key(学号), Add index mark(出生日期,姓名); 例2:在kb中为课程名添加一个候选索引kcm_kb,并查看 Alter table kb add unique index kcm_kb(课程名); 或create unique index kcm_kb on kb(课程名); 例3:在cjb中为成绩字段创建一个普通索引cj_cj,并查看 Alter table cjb add index cj_cjb(成绩 desc); 查看索引的方法: 1、 desc 表名; 2、 show index from 表名; 3、 show create table 表名; 删除索引: 当一个索引不需要是可以用drop index语句或alter table语句删除;
    使用drop index 索引名 on 表名; 例:删除xsl表中的xh_xsl索引 drop index xh_xsl on xsl;
    使用alter table 表名 drop index 索引名; 例:删除xsl表中的xm_xsl索引 alter table xsl drop index xm_xsl;
    使用alter table 语句删除索引语法: Alter table tb_name(表名) Drop primaty key //删除主键 Drop index index_name(索引名) //删除索引 Drop foreign key fk_name(索引名) //删除外键 例:删除xs表中的主键和mark索引 Alter table xs Drop primary key, Drop index mark; 注意:不能使用drop来创建主键,也不能使用drop命令删除主键 数据完整性约束 在了解数据完整性约束先了解什么是子表什么是父表: 子表与父表: 例:1:n(一对多关系) 1:1方为父表 n:n方为字表 查看外键:show crate table 表名 数据完整性约束 参照完整性约束 外键(foreign key)约束标识表之间的关系,用于强制参照完整性。 可在创建表时定义外键,也可在修改表时添加外键。 当两个表存在一对多关系时,一方是父表,多方是子表,如果父子表中相同的这段,在父表中主键,则在子表中创建外键,以保证子表外键字段的值必须来自父表,同时可设置两个表中数据的一致性,实现参照完整性。

    展开全文
  • 在项目中遇到并发导入excel数据到同一张表,  最初没有设置unique索引,导致在多线程并发导入excel数据的时候,业务上要求供应商代码不...因为失效删除的数据是打了标记的,有效的相同供应商代码还是可以插入进来...

    在项目中遇到并发导入excel数据到同一张表, 
    最初没有设置unique索引,导致在多线程并发导入excel数据的时候,业务上要求供应商代码不重复的字段,出现了重复,在这张数据表维护的时候,只有逻辑删除,不会物理删除,因此最开始没有去创建供应商代码的unique索引.

    单纯的对供应商代码做unique索引也是不能满足要求的

    因为失效删除的数据是打了标记的,有效的相同供应商代码还是可以插入进来.

    后来想到了加上一个删除时间Delete——time 
    默认值为0 
    删除时把当前的系统时间毫秒存到这个字段,有效的数据Delete_time就为0

    在删除并发时候,毫秒数一样会提示用户稍后删除. 
    这样就实现了多线程插入数据保证一致性的问题

    然后联合业务需求不能重复的字段建立联合索引 
    如下图:

    这里就是建立的唯一索引

    转载于:https://blog.csdn.net/a417074865/article/details/50609025 

    展开全文
  • 看一下维基百科怎么说的: 幂等:多次调用方法或者接口不会改变业务状态,可以保证重复调用的结果和单次调用的结果一致。二、使用幂等的场景1、前端重复提交用户注册,用户创建商品等操作,前端都会提交一些数据给...

    自己最近负责的几个接口,都涉及到了幂等性的操作,抽空总结了一下,这也是面试官比较爱问的问题。

    一、什么是幂等?

    看一下维基百科怎么说的:

    18a7eb55a308f4e029a9b81a48fe8872.png

    幂等性:多次调用方法或者接口不会改变业务状态,可以保证重复调用的结果和单次调用的结果一致。

    二、使用幂等的场景

    1、前端重复提交

    用户注册,用户创建商品等操作,前端都会提交一些数据给后台服务,后台需要根据用户提交的数据在数据库中创建记录。如果用户不小心多点了几次,后端收到了好几次提交,这时就会在数据库中重复创建了多条记录。这就是接口没有幂等性带来的 bug。

    2、接口超时重试

    对于给第三方调用的接口,有可能会因为网络原因而调用失败,这时,一般在设计的时候会对接口调用加上失败重试的机制。如果第一次调用已经执行了一半时,发生了网络异常。这时再次调用时就会因为脏数据的存在而出现调用异常。

    3、消息重复消费

    在使用消息中间件来处理消息队列,且手动 ack 确认消息被正常消费时。如果消费者突然断开连接,那么已经执行了一半的消息会重新放回队列。

    当消息被其他消费者重新消费时,如果没有幂等性,就会导致消息重复消费时结果异常,如数据库重复数据,数据库数据冲突,资源重复等。

    三、解决方案

    1、token 机制实现

    通过token 机制实现接口的幂等性,这是一种比较通用性的实现方法。

    示意图如下:

    19673c072c5fd901a5daca5aad700150.png

    具体流程步骤:

    客户端会先发送一个请求去获取 token,服务端会生成一个全局唯一的 ID 作为 token 保存在 redis 中,同时把这个 ID 返回给客户端

    客户端第二次调用业务请求的时候必须携带这个 token

    服务端会校验这个 token,如果校验成功,则执行业务,并删除 redis 中的 token

    如果校验失败,说明 redis 中已经没有对应的 token,则表示重复操作,直接返回指定的结果给客户端

    注意:

    对 redis 中是否存在 token 以及删除的代码逻辑建议用 Lua 脚本实现,保证原子性

    全局唯一 ID 可以用百度的 uid-generator、美团的 Leaf 去生成

    2、基于 mysql 实现

    这种实现方式是利用 mysql 唯一索引的特性。

    示意图如下:

    250a85c0260eec0be2e544d227ac2716.png

    具体流程步骤:

    建立一张去重表,其中某个字段需要建立唯一索引

    客户端去请求服务端,服务端会将这次请求的一些信息插入这张去重表中

    因为表中某个字段带有唯一索引,如果插入成功,证明表中没有这次请求的信息,则执行后续的业务逻辑

    如果插入失败,则代表已经执行过当前请求,直接返回

    3、基于 redis 实现

    这种实现方式是基于 SETNX 命令实现的

    SETNX key value:将 key 的值设为 value ,当且仅当 key 不存在。若给定的 key 已经存在,则 SETNX 不做任何动作。

    该命令在设置成功时返回 1,设置失败时返回 0。

    示意图如下:

    e0ecebcb81c5aea4d6c3a0a2966646cd.png

    具体流程步骤:

    客户端先请求服务端,会拿到一个能代表这次请求业务的唯一字段

    将该字段以 SETNX 的方式存入 redis 中,并根据业务设置相应的超时时间

    如果设置成功,证明这是第一次请求,则执行后续的业务逻辑

    如果设置失败,则代表已经执行过当前请求,直接返回

    总结

    这几种实现幂等的方式其实都是大同小异的,类似的还有使用状态机、悲观锁、乐观锁的方式来实现,都是比较简单的。

    总之,当你去设计一个接口的时候,幂等都是首要考虑的问题,特别是当你负责设计转账、支付这种涉及到 money 的接口,你要格外注意喽!

    干货分享

    最近将个人学习笔记整理成册,使用PDF分享。关注我,回复如下代码,即可获得百度盘地址,无套路领取!

    •001:《Java并发与高并发解决方案》学习笔记;•002:《深入JVM内核——原理、诊断与优化》学习笔记;•003:《Java面试宝典》•004:《Docker开源书》•005:《Kubernetes开源书》•006:《DDD速成(领域驱动设计速成)》•007:全部•008:加技术群讨论

    近期热文

    关注我

    喜欢就点个"在看"呗^_^

    展开全文
  • 在业务代码已经保证插入身份证唯一的情况下,可以选择建立唯一索引和普通普通索引,这时该如何选择呢?接下来,将从查询和更新的执行过程进行分析。 Top 查询过程 假设 k 是表 t 上的索引,在搜索 select id from...
  • 约束 全称完整约束,它是关系数据库中的对象,用来存放插入到一个表中一列数据的规则,...唯一约束 保证在一个字段或者一组字段里的数据都与表中其它行的对应数据不同。和主键约束不同,唯一约束允许为 NULL,只...
  • 如果确定某个数据列只包含彼此各不相同的值,在为这个数据列创建...也就是说,唯一索引可以保证数据记录的唯一性。事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现...
  • 约束 全称完整约束,它是关系数据库中的对象,用来存放插入到一个表中一列数据的规则,...唯一约束 保证在一个字段或者一组字段里的数据都与表中其它行的对应数据不同。和主键约束不同,唯一约束允许为 NULL,只...
  • 唯一索引可以作为数据的一个合法验证手段,例如学生表的身份证号码字段,我们人为规定该字段不得重复,那么就使用唯一索引。(一般设置学号字段为主键)主键和唯一索引主键保证数据库里面的每一行都是唯一的,比如...
  • 索引是一种特殊的文件,它们包含着对所有记录的引用指针。 普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。 普通索引允许被索引...也就是说,唯一索引可以保证数据记录的唯一性。 ...
  • 保证数据记录的唯一性;实现表与表之间的参照完整性;在使用group by order by子句进行数据检索时,利用索引可以减少排序和分组的时间; 注意:一个表最多可以有16个索引;可以由单个字段创建索引,也可以在多个字段...
  • 约束 全称完整约束,它是关系数据库中的对象,用来存放插入到一个表中一列数据的规则,用来确保数据的...唯一约束 保证在一个字段或者一组字段里的数据都与表中其它行的对应数据不同。和主键约束不同,唯一约束...
  • 1、创建唯一约束时会自动创建唯一索引,创建唯一索引时不会创建唯一约束。... 4、用途不同,索引是为了加快检索速度,约束是为了保证数据完整。  创建索引:create index metaid_copys on i_copys(met
  • mysql中unique创建唯一索引

    千次阅读 2018-06-24 21:30:19
    很多情况下我们都会要求某些字段不可重复,如用户名、手机号等,我们可以在MySQL数据表中设置指定的字段为 PRIMARY KEY(主键) 或者 UNIQUE(唯一) 索引保证数据唯一性。主键约束要保证数据既不可以为空也不可...
  • 唯一索引能够保证索引键中不包含重复的值, 从而使表中的每一行从某种方式上具有唯一性, 只有当唯一性数据本身的特征时, 指定唯一索引才有意义. 例如, 如果您希望确保HumanResources.Employee表的NationalIDNumber...
  • 因为在等值查询时,由于唯一索引唯一性,只要行锁,就能保证不会幻读; 而普通索引的等值索引,还使用行锁的,那么可以插入相同的行,就会出现幻读。 例如: select * from test where col=1 for update; 如果col...
  • 一、唯一索引: 一是简化了MySQL对这个索引的管理...也就是说,唯一索引可以保证数据记录的唯一性。事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。 CREA...
  • 1.唯一性约束用来限制不受主键约束的列上的数据唯一性,用于作为访问某行的可选手段, 指定列上都不允许有相同的值,允许空(NULL) 2.唯一约束可以用于保证在基表中增加一条记录时,一个或多个列值是...
  • 可以通过建立唯一索引或者主键索引,保证数据唯一性.2.提高检索的数据性能3.在表连接的连接条件 可以加速表与表直接的相连4.建立索引,在查询中使用索引 可以提高性能索引缺点1.在创建索引和维护索引 会耗费时间,...
  • 主键可以保证记录的唯一和主键域非空,数据库管理系统对于主键自动生成唯一索引,所以主键也是一个特殊的索引。2、外键(foreign key)是用于建立和加强两个表数据之间的链接的一列或多列。外键约束主要用来维护两个表...
  • MySQL的几个概念:主键,外键,索引,唯一索引主键...主键可以保证记录的唯一和主键域非空,数据库管理系统对于主键自动生成唯一索引,所以主键也是一个特殊的索引。外键(foreign key)是用于建立和加强两个表数据...
  • 写入方面:对于唯一索引,因为需要保证唯一性,所以每一次的写操作都必须将值读到内存中,所以如果对应的数据页不在内存中,那么肯定会有一次磁盘随机读;但是对于普通索引,因为有change buffer机制,所以,如果...
  • 主键可以保证记录的唯一和主键域非空,数据库管理系统对于主键自动生成唯一索引,所以主键也是一个特殊的索引。外键(foreign key)是用于建立和加强两个表数据之间的链接的一列或多列。外键约束主要用来维护两个表之间...
  • 添加唯一索引数据可以为空,但是只要尊在数据值,就必须是唯一的。 联系:1)unique index就是额外添加唯一性的约束。该约束严格的保证索引列的取值是唯一的,这在一些数据列上的业务约束是很重要的功能。...
  • 主键可以保证记录的唯一和主键域非空,数据库管理系统对于主键自动生成唯一索引,所以主键也是一个特殊的索引。 2、外键(foreign key) 是用于建立和加强两个表数据之间的链接的一列或多列。外键约
  • 添加唯一性索引数据可以为空,但是只要存在数据值,就必须是唯一的。 联系:(1)Unique Index就是额外添加的唯一性约束。该约束严格的保证索引列的取值唯一性,这在一些数据列上的业务约束实现是很重要的功能...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,379
精华内容 551
关键字:

唯一索引可以保证数据唯一性