【转】数据库索引详细介绍

原文链接:https://blog.csdn.net/weixin_41948075/article/details/100009848

索引的定义


索引相当于一本书的目录,通过目录我们可以迅速定位书中要找的内容。MySQL中的索引也是一样,它是一种帮助MySQL高效获取数据的数据结构(树)
索引怎么实现的?为什么用B+树?

索引是数据库中一个用于排序的数据结构,用来快速查询数据库中的数据。Mysql数据库使用B+树来实现索引的。B+树的特点就是叶子节点包含了所有的关键字信息和data数据,非叶子节点只包含子节点的最大或者最小关键字,用来实现索引。

好处:既能实现快速查找,相比于B树又节约了内存空间。

Mysql数据库中的索引实现主要依赖于两个存储引擎,MyISAM和InnoDB,都是使用B+树作为索引结构。区别就是MyISAM中使用B+树的叶子节点的data域存放数据的内存地址,而InnoDB中树的叶节点data域保存了完整的数据。

建索引的优缺点


优点:大大加快对数据的查询速度
缺点:占物理空间,对数据库进行增删改的时候也要动态的维护索引。

索引的作用


♢ \color{green}{\diamondsuit}♢提高查询速度
♢ \color{blue}{\diamondsuit}♢确保数据的唯一性
♢ \color{pink}{\diamondsuit}♢可以加速表和表之间的连接,实现表和表之间的参照完整性
♢ \color{red}{\diamondsuit}♢使用分组和排序子句进行数据检索时,可以减少分组和排序的时间
♢ \color{grey}{\diamondsuit}♢全文检索字段进行搜索优化

索引如何提高查询速度呢

假如我们有如下的一张表,在没有引入索引之前,假如我们想查询表中的一条年龄为20的数据,那么几乎要遍历完整个表才能查询到这条数据;现在我们引入索引,并且以age列作为索引列来构建出一个二叉树的索引结构来,具体的构造过程是先把表中第一行的age(49)作为二叉树的头结点,然后顺序往下遍历,把小于头节点的age放到左边,大于头结点的age放到右边,表中数据遍历完以后就构造出了右图所示的二叉树索引结构。现在我们再来试着查找年龄为20的数据所需要的过程:

在这里插入图片描述
1.将age为20的数据先和头结点的49比较(20<49),所以往左边走
2.来到树形结构的第二层,继续和21比较(20<21),继续往左边走
3.来到树形结构的第三层,和20比较(20=20)查,找成功

 

加上索引以后只需三次就查找成功了,可见索引确实可以提高我们SQL的查询效率。
 

什么场景不适合创建索引


 在查询中很少使用或者是参考的列不适合创建索引。因为既然这些列很少使用到,因此有无索引,并不能提高查询速度。相反,增加了索引反而降低了系统的维护速度且增大了空间需求。
 只有很少数据值的列不适合创建索引。因为本来结果集合就相当于全表查询,因为由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索的速度。
 被定义为text, image和bit数据类型的列不适合创建索引。因为这些列的数据量要么相当大,要么取值很少。
 当修改性能远远大于检索性能时不应该创建索引。修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。
 经常插入、删除、修改的表
 不会出现在where条件中的字段不适合建立索引。


什么样的字段适合创建索引


1、表的主键、外键必须有索引;外键是唯一的,而且经常会用来查询
2、数据量超过300的表应该有索引;
3、经常与其他表进行连接的表,在连接字段上应该建立索引;经常连接查询,需要有索引
4、经常出现在Where子句中的字段,加快判断速度,特别是大表的字段,应该建立索引,建立索引,一般用在select ……where f1 and f2 ,我们在f1或者f2上建立索引是没用的。只有两个使用联合索引才能有用
5、经常用到排序的列上,因为索引已经排序。
6、经常用在范围内搜索的列上创建索引,因为索引已经排序了,其指定的范围是连续的

简单记就是唯一、不为空、经常被查询的字段

索引的分类(数据库索引详细介绍_lucky多多的博客-CSDN博客_数据库索引

  • 主键索引(PRIMAY KEY)
  • 唯一索引(UNIQUE)
  • 常规索引(INDEX)
  • 全文索引(FULLTEXT)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小金子的夏天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值