什么是 MySQL 索引?

一、什么是索引?

索引是为了加速对表中数据行的检索而创建的一种分散的存储结构。索引是针对表而建立的,它是由数据页面以外的索引页面组成的,每个索引页面中的行都会含有逻辑指针,以便加速检索物理数据。

简单来说,索引就相当于一本书的目录,只为了提高查找的的效率;

二、索引要解决的问题有哪些?

如果数据库没有索引,查找数据就得将整个表遍历一边,相当于 “ 顺序表查找 ”;
如果是针对数据库顺序查找,数据库的数据是存放在磁盘上的,磁盘访问速度很慢,并且数据量大,查找速度就更慢了;

索引就是为了数据库避免顺序查找,提高查找效率;

三、索引的应用场景

数据量比较大,查询字段较多的情况。

四、索引的数据结构

在计算机数据结构体系中,为了加速查找的速度,常见的数据结构有两种:
– Hash哈希结构,例如Java中的HashMap,这种数据组织结构可以让查询/插入/修改/删除的平均时间复杂度都为O(1);
– Tree 树 结构 , 这种数据组织结构可以让查询/插入/修改/删除的平均时间复杂度都为O(log(n));
这两种数据结构查找效率都很高,但是为啥没有使用呢?

1、为啥不用哈希j结构
虽然哈希表查找数据的时间复杂度为 O(1),效率高,但是哈希表的查找过程是把 key 代入哈希函数中,计算得出下标,再根据下标取对应的链表,再去遍历链表比较 key 是否相等。它只能处理相等的情况,不能处理其他的逻辑(比如 大于,小于,大于等于,小于等于,in ……);

2、为啥不用二叉树结构
对于二叉搜索书,如果平衡的话,查找数据的时间复杂度为 O(logN),它的中序遍历结果是有序的,但是对于一个范围查找的话,边界值得查找时间复杂度为 O( logN ),在中序遍历范围间的元素时,时间复杂度是 O(N),对与本来的顺序查找时间复杂度 O(N) ,效率也高不了多少;而且二叉搜索树每个节点都只有两个度,当数据量很大时,树的高度就很高,最终的操作效率就很低了;二叉树每个节点只存储一个记录,一次查询在树上找的时候花费磁盘 IO 次数较多;

3、MySql 索引的数据结构是 B + 树

首先,先了解啥是 B 树(也称 B - 树)
在这里插入图片描述
如图所示,该树不再是二叉搜索,而是N叉搜索树

特点:
– 是N叉搜索,树的高度会降低,查询快;
– 叶子节点,非叶子节点,都可以存储数据,且可以存储多个数据,而且每个节点的度 = 该节点存的数据个数 + 1;
– 通过中序遍历,可以访问树上所有节点

B + 树
在这里插入图片描述
和 B树 相比:每一层的元素节点都连在了一起,数据只在叶子节点保存,非叶子节点只保存一些辅助查找的边界信息;

优势:
查询任意一条记录的速度都是比较平均的,不会出现效率差异太大的情况;
仍然是N叉树,层级小,非叶子节点不再存储数据,数据只存储在同一层的叶子节点上,B + 树 从根到每一个节点的路径长度一样;
不需要进行中序遍历,遍历链表就是得到中序结果,处理范围查找效率就更高效了;
范围查找方面,当定位min与max之后,中间叶子节点,就是结果集,不用中序回溯(范围查询在SQL中用得很多,这是B+树比B树最大的优势);
叶子节点数据在磁盘上,非叶子节点数据都在内存上,减少了对磁盘的读取次数,查找效率更高了;

五、索引的基本方法

  1. 创建索引:create index 索引名 from 表名;
  2. 修改索引: alter index 索引名 from 表名;
  3. 删除索引:drop index 索引名 from 表名;

六、索引规则

  1. 选用选择性高的字段作为索引,一般unique的选择性最高。
  2. 复合索引:选择性越高的排在越前面。(左前缀原则)
  3. 如果查询条件中两个条件都是选择性高的,最好都建索引。

索引的缺点:

  1. 虽然加快了查找的效率,但是降低插入,删除,修改操作的效率,因为要同步调整索引结果;
  2. 索引也会占额外的空间,即索引本质上是用空间来换时间的;
    .
    七、注意事项
    并非所有的数据库都以相同的方式使用索引。作为通用规则,只有当经常查询索引列中的数据时,才需要在表上创建索引。索引占用磁盘空间,并且降低添加、删除和更新行的速度。如果应用程序非常频繁地更新数据或磁盘空间有限,则可能需要限制索引的数量。在表较大时再建立索引,表中的数据越多,索引的优越性越明显。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值