大家好,我是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,那么这一列的索引在查找时也就失效了,所以一般设置索引的列都不准输入值为空。
以上是本次小课堂的主要内容
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~
技能树.IT修真院
“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。
这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。快来与我一起修仙吧~
网友评论