美文网首页
普通索引和唯一索引的区别以及何时需要建立索引

普通索引和唯一索引的区别以及何时需要建立索引

作者: 超超超超超帅 | 来源:发表于2018-04-09 23:29 被阅读0次

               

    大家好,我是IT修真院上海分院第6期学员,一枚正直善良的JAVA程序员。

    今天给大家分享一下,修真院官网JAVA任务1中普通索引和唯一索引的区别以及何时建立索引的探讨。

    一、背景介绍

    索引作用:简而言之,加快搜索速度

    常见索引分类:普通索引,唯一索引,主键索引,全文索引,组合索引

    今天主要探讨普通索引,唯一索引和主键索引,不涉及全文索引和组合索引

    二、知识剖析

    普通索引:最基本的索引,相对于唯一索引和主键索引无特殊限制

    主键索引:是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值,将整个数据表变成聚集索引

    主键索引:是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值,将整个数据表变成聚集索引

    唯一索引与主键索引不一样的地方:

    ①本质:主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。

    ②包含关系:主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。

    ③空值:唯一性索引列允许空值,而主键列不允许为空值。

    ④默认创建:主键列在创建时,已经默认为空值 + 唯一索引了。

    ⑤主键唯一性:一个表最多只能创建一个主键,但可以创建多个唯一索引。

    ⑥引用外键:主键可以被其他表引用为外键,而唯一索引不能。

    索引原理:

    几乎所有索引都是单独建立目录,里面按顺序(B-Tree)存储着字段所有值和对应的主键,然后在索引中找到查询的字段后,依靠此主键去聚集索引中查询该条信息

    三、常见问题

    既然索引这么牛,那我是不是应该每个字段都加一个呢?

    答案当然是否定的

    建立一个索引,就会将该字段的值取出来排序重新建立一个目录,每一个字段建立的目录都不一样,互不影响,所以,每新建一个索引:

    1.增删改的速度就会慢上一分,因为得去修改相应目录

    2.表格体积就会更臃肿,因为目录也是要占用空间的

    四、解决方案

    这些情况下不适合用索引:

    1.字符长度过长不适合建

    2.字段较少不适合建

    3.数据较少不适合建

    4.查询较少不适合建

    5.更新频繁不适合建

    6.唯一性差的字段不适合建

    五、编码实战

    针对师兄几个问题,测试如下

    首先往名字设置唯一索引的表格添加十条数据

    再添加一次,数据相同,大家知道,肯定是插入失败

    此时,数据库里还是只有十条数据的,我再随便加入一条确定好可以发现

    从上图可以看到,id 11被跳过了,所以应该是先增加再删除

    六、扩展思考

    使用索引需要注意的点

    1.尽量先装载数据再建立索引

    2.like模糊查询时,带索引字段关键词不要使用左模糊查询和全模糊查询

    3.一个表的索引尽量不要超过三个,严禁超过五个

    4.在varchar等字段类型上建立索引时,须指定索引长度,可以提高速度节约空间减少IO操作

    5.索引不会包含有null值的列

    6.有where子句的情况下order by子句索引会失效,建议建立复合索引

    7.不要在查询列上进行运算,也会导致索引失效

    使用误区

    1.宁缺毋滥,认为一个查询就需要建一个索引。

    2.宁滥勿缺,认为索引会消耗空间、严重拖慢更新和新增速度。

    3.抵制唯一索引,认为业务的惟一性一律需要在应用层通过“先查后插”方式解决。

    七、参考文献

    阿里开发手册

    https://zhuanlan.zhihu.com/p/23624390

    https://www.cnblogs.com/luyucheng/p/6289714.html

    八、更多讨论

    1.

    应用层即在java中使用判断语句来判断数据是否重复,如果重复,则会跳出警告并且不会添加此条信息,而唯一索引抛出异常是数据库本身的操作,所以当高并发的情况下,如果提交数据存在延迟,使用第一种情况就有可能造成数据的重复从而造成业务错误,而在数据库中使用唯一索引判断则不会出现此情况,感谢师兄的补充,对于高并发的确是我知识点的空缺

    2.

    关于此问题,就要涉及到索引的原理了,因为唯一索引是先从索引目录中找指定字段,找到后根据指定字段的主键去聚集索引里找寻,所以比直接利用主键索引多了一个步骤,因此,使用主键索引查找一定是更快的。

    3.

    在唯一索引中,只要设置允许null值,那么无论多少个Null,其值都是不重复的,因为java中规定null不为任何值。但是如果某一列存在null,那么这一列的索引在查找时也就失效了,所以一般设置索引的列都不准输入值为空。

    以上是本次小课堂的主要内容

    本次小课堂PPT

    本次小课堂视频

    今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

    技能树.IT修真院

    “我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。

    这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。快来与我一起修仙吧~

    直接点击此链接:http://www.jnshu.com/login/1/22137050

    相关文章

      网友评论

          本文标题:普通索引和唯一索引的区别以及何时需要建立索引

          本文链接:https://www.haomeiwen.com/subject/xduwhftx.html