数据库索引对于一个开发来说至关重要,如果使用得当,他可以让我们的查询数据的效率大大提高,具体可以参考二分查找,缩短至O(lgn),具体就要看底层的B+Tree有几层到底多高了。
1、什么是数据库索引?
数据库索引本质上是一种数据结构(存储结构+算法),目的是为了加快目标数据检索的速度。
其实给数据库建立索引就相当于给表中这个属性排序,一旦给这个table的这个属性建立了索引,他就相当于对这个属性建立了一个B+树,通过这个数,我们在下次select数据时,就不必再逐条记录去遍历比对了,而是通过这个B+数(类似于二分查找)就可以快速定位到这条记录,然后再通过这条记录所对应的主键,再去select一次,查找到所需的数据。干巴巴说实在没意思,下面上图:
这是一个简单的table,如果不建立所以,我们想要查找money=8888的房间信息时,也就是Select * from zufang where money=8888。这时他就必须要逐条开始匹配去查找该记录,从1开始一直到7。也就是说一共查询了7次才找到,但是如果说我们对money这个属性建立了索引,create index index_money on zufang(money)。之后,这个money就会形成一种B+树的 数据结构,此时查询到这条信息应该只需要3步,再加上最后一步获取主键后再次一次,总共也就是3+1=4步。这还是数据量少的时候,如果此时表中有海量数据,则查询性能会大大提高。
2、B+树
说了半天B+树,那么到底什么是B+树,其实B+树就是一个有序的平衡树,它不局限与每个节点只有2个节点,且除去叶子节点外的所有节点都不存储真正的数据信息,只存储对应的索引信息。具体可以看下图:
从图中可以看出,他的非叶子节点存储的都是对应的索引信息,通过B+树,我们可以快速定位到所查询的数据。这种时间复杂度仅依赖与构建的B+树的深度。由于查找方便,B+树被广泛的运用在数据库和操作系统的文件系统中去。其插入和修改都具有十分稳定的对数级复杂度,插入操作自底而上完成的。
3、索引的分类
1、唯一索引
对于一张表来说,通常主键就是唯一索引,顾名思义,唯一索引在一张表中只能存在一个。对于有些数据库来说,创建表时一定要指定主键,当然也有些不需要。与主键不同的是,唯一索引可以不建立,为空。
2、覆盖索引
这种索引就是一种特殊的联合索引,它将要查询的数据也覆盖在索引列表中,这样在查询时,一旦通过索引查到了数据之后,就无需再通过主键再查询一次,可以直接得到想要的数据。它的性能也是最好的。
例如这个查询中的colum1是待查询的参数。这就是覆盖索引。
select colum1 from table where colum1 = ? and colum2 > ?
3、聚集索引
对于聚集索引来说,表上的物理顺序,和索引中数据的顺序是一一对应的。而如果该表没有聚集索引,则表上的顺序和实际上所存储的顺序其实是不一致的,所以一张表只能对应一个聚集索引,聚集索引的速度也很快。
4、索引的优缺点
索引的建立的确可以大大提高其查询的效率,但是其本质是利用空间来换时间,索引也会带来以下几个负面影响:
1、索引的建立可以使得数据在插入表中时不会把所有的数据都存放在最后一页数据页中。
2、建立索引只适合频繁select的表,而不适合经常update、insert、delete的表格,因为每次表中数据的变化都需要对相关的索引进行一一对应的更新,这样就会大大降低其更新的速度。
3、索引的建立是需要空间的,越大的表所需要的空间越多,当开始建立索引时,数据库会将对应列的数据复制一遍,用以建立索引的B+树结构。
5、什么情况下索引会失效
通常情况下,一旦使用where name="XXX"时,数据库会自动检测index列表中是否有name这个索引的建立,如果有就会自动去使用索引。但是在某些特殊情况下,某些情况下索引虽然建立了但是却也会失效。例如说:
1、使用了like且%放置在前;
2、使用了or来级联条件;
3、使用了<>符号;
4、如果后面使用了类型是字符串,一定要用‘’将其括起来;