什么数据库索引,简单说一下数据库索引

首先我们要理清逻辑:

分点来论述
1.先说说什么是数据库的索引(定义)
2. 再说说数据库索引的作用
3. 最后谈谈数据库索引底层的存储方式,以及查询方式

那么下面我们就来一一说说:

当被问到数据库索引时,首先可以回答数据库索引是添加数据库表中的字段上的,也就是给这个字段进行排序,是为了提高查询效率而存在的一种机制,一张表的一个字段可以添加一个索引,多个字段也可以添加一个索引,它相当于字典中的目录,可以让我们更快的查询到数据(表中的主键,unique会自动添加索引)
举一个例子,有一个student学生表,里面有id ,name , score等信息,我们要查询名字为张三的学生信息:

select  *  from student  where  name ='张三';

对于上面这条语句,如果没有对学生姓名那一列字段加索引,MySQL会从第一行数据开始,每一行进行扫描并对于是否等于张三(这种方式称为全表扫描),如果数据少的话,是可行的,如果数据上千条甚至几十万条的时候,这样挨个对比就显得太笨拙了,效率太低了
那么就出现了索引,通过索引来检索,索引是需要排序的,底层使用B+树来实现
大致就是下面这个样子,右边是b+树,从下往上看,最底层是一串有序链表,包括了id(索引)(1 2 3 5 等 )数据data 和下一个数据的地址,其中12称为1页,它包含在同一个区域中,一页最多可存放16kb的数据,上一层是存储的下一层的每页首/尾id,下图中存放的是尾id也就是每一页最大的id,最顶层也是如此,存放中间那层每一页的最大id,这样查找的话,就很方便,例如我们要查找10这个数据,从最顶端10肯定是大于8小于15的,所以直接就进入了右分支,10又是小于11的,所以就进入了9 11 这一页,最后结果肯定也在这其中,这样查找起来就快很多
在这里插入图片描述
注意:在数据库的聚集索引(Clustered Index)中,叶子节点直接包含数据。在非聚集索引(NonClustered Index)中,叶子节点带有指向数据的指针。上述图中就只是带有指向数据的指针

另一方面,B+树对于范围查询也是很快的,比如我们要查找6-13之间的数据,他会先和上面方法一样查询到6位置,然后直接根据有序链表向前查找到13,此处就比b树要显得方便很多(b树是先查询到6,然后根据中序遍历查询到8,再到8-15这一页,再到右边的11-15这一页,最后才找到9-11)


最后来个总结:

B+树的特征:

1.有k个子树的中间节点包含有k个元素,每个元素不保存数据,只用来索引,所有数据都存在叶子节点中
2.叶子节点本身又是一个有序的链表,自小到大连接
3.所有的中间节点元素同时存在于子节点中,在子节点元素是最大/最小值

B+树的优势:
1.单一节点存储更多的数据,减少查询的IO次数
2.所有的数据放在叶子节点中,意味着每次都要查询到叶子节点中,查询性能稳定
3.所有的叶子节点又是一个有序链表,便于范围查询


创建索引和查询索引

查询索引

explain   select * from 表名  where 列名 = 'King';
查询这个列名是否有索引 

创建索引

create  index  索引名  on 表名(列名) 

那么接下来可能还会进一步问 你知道什么情况下索引会失效吗

1.以%开头的模糊查询
2.使用or 也很可能会失效,因为or的两边都有索引的时候才会利用索引查询
3.使用复合索引,没有使用左列查找,索引也会失效 这个可能不太能明白,举个例子
现在给 student表中的 name id 创建复合索引 create index stu_index on student(name,id)
那么如果使用

select  * from  student  where  name = '张三'  此时会用到索引,
 而select  * from  student  where  id = 10;不会用到索引

此时就成会索引失效,因为name在左侧 ,创建索引必须加上左侧的字段才能使用索引
4.where中索引列加入了位运算,索引失效

例如  select  * from  compane where  sal+1 = 800;

还有 什么情况下可以添加索引? 给每个字段都能加索引吗

并不需要给每个字段都加上索引
1.当数据量庞大的表中需要添加索引
2.加索引的字段经常出现在where关键字后面,也就是说经常作为条件来查询
3.加索引的字段很少进行DML操作 也就是 insert delete update等操作

这里补充一下数据库常见语言
1.DQL :数据库查询语言 select
2.DML:数据库操作语言 用来操作字段中的数据 例如 insert delete update
3.DDL:数据库定义语言:用来操作数据库中表结构 例如:create alter drop
4.TCL: 事物控制语言:用来操作事务相关 例如 提交commit 回滚rollback
5.DCL :数据库控制语言:授予权限 grant 撤销权限 revoke

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值