1.什么是索引?
答:索引是帮助MySQL提高查询效率的数据结构,相当于在一本中华字典中,我们可以使用“目录”对指定字词进行定位查找。而这里的“目录”,就是我们数据库中的经常提到的术语“索引”。
2.为什么要用索引?
答:提高查询效率。试想一下,在有着庞大数据量(上万甚至十万以上级别)的数据表中,倘若没有索引,就相当于是在一本没有目录的中华字典中查询你要的字,那么你的做法就是:傻傻的、一页一页地去查询。(几千页啊!可得翻的心憔悴!)但是有了目录了,在中华字典中,我们就可以根据目录中的拼音、偏旁等特征进行快速查询,查询量显而易见地减少了很多。同理,数据库中的索引根据键值来定位查询。(这里后续会慢慢讲到)。
3.索引的分类
(1)主键索引
设定为主键后数据库会自动建立索引,innodb为聚簇索引。(这一点及其重要!是后续讲解B+树原理时的铺垫)
eg:在实际数据库设计中,大多离不开字段id,并会设置其为主键,数据类型为int。此时我们插入数据时,假如顺序杂乱无章,如以顺序(5,2,1,3,6,4,....)插入,当我们存储后,再次查看表时,就会发现id自动排序了 。
插入数据时:
成功存储后:
可以看到,MySQL自动将id按照升序进行排列了。为什么要这样呢?这就是之后详解B+树原理的铺垫了。
(2)单值索引
即一个索引只对应一个列,一个表中可以有多个索引。
(3)唯一索引
索引列的值必须唯一,但允许有空值。像主键索引就是一种特殊的唯一索引。
(4)复合索引
即一个索引包含多个列,与单值索引相对。
4.索引的缺点
我们都说,凡事都有利弊。对于索引,也毫不例外。计算机中的各类优化算法啥的,本质上就是时间和空间的转换。同样以中华字典为例,设置的目录是需要消耗纸张的,同时我们也需要花费时间访问目录,再者目录能够设定的前提是要有一个查找依据(即底层原理),例如偏旁、拼音,那就意味着字典中需要将偏旁相近、拼音相近的字凑在一起。换句话说,一旦字典出了新版,插入或删除了新的字,那可得花费一段时间在改目录上。
以上了解后,我们对索引缺点的总结如下:
(1)维护索引需要耗费数据库资源
(2)索引需要占用磁盘空间(字典的纸张)
(3)当对表的数据进行增删改查的时候,因为要维护索引,速度会受到影响。(改目录)