普通索引和惟一索引的思考

你们好,我是IT修真院深圳分院java第4期学员,一枚正直善良的java程序员。今天给你们分享一下,修真院官网java任务一中关于普通索引和惟一索引的区别,以及在任务中使用的一些感想。html

1.背景介绍java

索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。 从数据搜索实现的角度来看,索引也是另一类文件/记录,它包含着能够指示出相关数据记录的各类记录。mysql

2.知识剖析git

在了解数据库索引以前,首先了解一下数据库索引的数据结构基础:B+tree程序员

clipboard.png

说一下重点,浅蓝色的块咱们称之为一个磁盘块,能够看到每一个磁盘块包含几个数据项(深蓝色所示)和指针(黄色所示)。如磁盘块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索引原理及慢查询优化

参考二:类型转换对MySQL选择索引的影响

参考三:MySQL8.0参考手册

8.更多讨论

PPT连接:戳这里

腾讯视频:戳这里

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

相关文章
相关标签/搜索