你们好,我是IT修真院深圳分院java第4期学员,一枚正直善良的java程序员。今天给你们分享一下,修真院官网java任务一中关于普通索引和惟一索引的区别,以及在任务中使用的一些感想。html
1.背景介绍java
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。 从数据搜索实现的角度来看,索引也是另一类文件/记录,它包含着能够指示出相关数据记录的各类记录。mysql
2.知识剖析git
在了解数据库索引以前,首先了解一下数据库索引的数据结构基础:B+tree程序员
说一下重点,浅蓝色的块咱们称之为一个磁盘块,能够看到每一个磁盘块包含几个数据项(深蓝色所示)和指针(黄色所示)。如磁盘块1包含数据项17和35,包含指针P一、P二、P3,P1表示小于17的磁盘块,P2表示在17和35之间的磁盘块,P3表示大于35的磁盘块。真实的数据存在于叶子节点即三、五、九、十、1三、1五、2八、2九、3六、60、7五、7九、90、99。非叶子节点只不存储真实的数据,只存储指引搜索方向的数据项,如1七、35并不真实存在于数据表中。github
查询时B+Tree究竟是怎么运做的?简单分析一下:sql
若是要查找数据项29,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分查找肯定29在17和35之间,锁定磁盘块1的P2指针,内存时间由于很是短(相比磁盘的IO)能够忽略不计,经过磁盘块1的P2指针的磁盘地址把磁盘块3由磁盘加载到内存,发生第二次IO,29在26和30之间,锁定磁盘块3的P2指针,经过指针加载磁盘块8到内存,发生第三次IO,同时内存中作二分查找找到29,结束查询,总计三次IO。真实的状况是,3层的b+Tree能够表示上百万的数据,若是上百万的数据查找只须要三次IO,性能提升将是巨大的,若是没有索引,每一个数据项都要发生一次IO,那么总共须要百万次的IO,显然成本很是很是高。数据库
B+Tree的性质:数据结构
1.n棵子tree的结点包含n个关键字,不用来保存数据而是保存数据的索引。性能
2.全部的叶子结点中包含了所有关键字的信息,及指向含这些关键字记录的指针,且叶子结点自己依关键字的大小自小而大顺序连接。
3.全部的非终端结点能够当作是索引部分,结点中仅含其子树中的最大(或最小)关键字。
索引分类:
mysql的索引分为单列索引(主键索引,惟一索引,普通索引)和组合索引。
单列索引:一个索引只包含一个列,一个表能够有多个单列索引。
组合索引:一个组合索引包含两个或两个以上的列。
普通索引,这个是最基本的索引。
惟一索引,与普通索引相似,可是不一样的是惟一索引要求全部的类的值是惟一的,这一点和主键索引同样,容许有空值。 创建惟一索引一个比较重要的做用是避免数据出现重复。
主键索引,不容许有空值。主键索引创建的规则是 int优于varchar,通常在建表的时候建立, 最好是与表的其余字段不相关的列或者是业务不相关的列。通常会设为 int 并且是 AUTO_INCREMENT自增类型的。
索引的优势:
1.能够经过创建惟一索引或者主键索引,保证数据库表中每一行数据的惟一性
2.创建索引能够大大提升检索的数据,以及减小表的检索行数
3.在表链接的链接条件,能够加速表与表直接的相连
4.在分组和排序字句进行数据检索,能够减小查询时间中 分组 和 排序时所消耗的时间(数据库的记录会从新排序)
5.创建索引,在查询中使用索引,能够提升性能。
索引的缺点:
1.在建立索引和维护索引,会耗费时间,随着数据量的增长而增长
2.索引文件会占用物理空间,除了数据表须要占用物理空间以外,每个索引还会占用必定的物理空间
3.当对表的数据进行 INSERT,UPDATE,DELETE 的时候,索引也要动态的维护,这样就会下降数据的维护速度,(创建索引会占用磁盘空间的索引文件)。
关于索引的优缺点你们结合B+Tree很容易就理解了。
3.常见问题
1:如何建立索引?
2:隐式类型转换对MySQL选择索引的影响?
3:什么状况下建索引?
4.什么状况不建索引?
5:索引对提升查询速度能提高多少性能?
4.解决方案
sql插入索引语句:
普通索引:ALTER TABLE table_name
ADD INDEX index_name ( column
)
惟一索引:ALTER TABLE table_name
ADD UNIQUE ( column
)
主键索引:ALTER TABLE table_name
ADD PRIMARY KEY ( column
)
当文本字段与数字进行比较时,因为类型不一样,MySQL 须要作隐式类型转换才能进行比较。
默认转换规则是:
不一样类型全都转换为浮点型
若是字段是字符,条件是整型,那么会把表中字段全都转换为整型
什么状况下要创建索引:
1.在常常须要搜索的列上,能够加快索引的速度。
2.主键列上能够确保列的惟一性。
3.在表与表的而链接条件上加上索引,能够加快链接查询的速度。
4.在常常须要排序(order by),分组(group by)和的distinct 列上加索引 能够加快排序查询的时间, (单独order by 用不了索引,索引考虑加where 或加limit)。
5.尽可能选择区分度高的列做为索引。
6.索引列不能参与计算,保持列“干净”。
7.尽可能的扩展索引,不要新建索引
什么状况下不创建索引:
1.查询中不多使用到的列 不该该建立索引,若是创建了索引然而还会下降mysql的性能和增大了空间需求。
2.不多数据的列也不该该创建索引,好比 一个性别字段 0或者1,在查询中,结果集的数据占了表中数据行 的比例比较大,mysql须要扫描的行数不少,增长索引,并不能提升效率。
3.定义为text和image和bit数据类型的列不该该增长索引。
4.当表的修改(UPDATE,INSERT,DELETE)操做远远大于检索(SELECT)操做时不该该建立索引,这两个操做是互斥的关系。
5.编码实战
6.扩展思考
若是对学员QQ号作了一个惟一索引,在插入数据的时候,是否须要先判断这个QQ号已经存在了?
若是qq号作了惟一索引,咱们插入时会提示咱们重复插入,阻止咱们插入。可是要是在现实业务中,咱们须要把这个反馈给客户端,因此咱们是须要作一个判断,若是qq号重复就把这个信息反馈给客户端。
7.参考文献
参考一:MySQL索引原理及慢查询优化
参考三:MySQL8.0参考手册
8.更多讨论
PPT连接:戳这里
腾讯视频:戳这里
今天的分享就到这里啦,欢迎你们点赞、转发、留言、拍砖~