索引(高级)

2.索引

2.1索引概述

索引:加快查询的一种数据结构。这个数据结构 指向 具体的表结构中的数据。在这里插入图片描述
没有索引: 查询记录时采用的是全表扫描。//查找3就得遍历7次才能找到对应数据。在这里插入图片描述
有了索引: //只需查找3次,就能找到对应数据。在这里插入图片描述

2.2索引的优势和劣势

优势:
1、提高检索效率,降低数据库的IO成本。
2、加快排序速度,降低CPU消耗。

劣势:
1、索引实际是一张表,位于磁盘中,会占用磁盘空间。
2、虽然大大提高了查询效率,但是也会降低更新表的速度。//因为,因为MySQL不仅要维护数据表,还得维护索引结构。
3、因此,索引字段不能太多,太多的话会影响数据表的更新速度。

2.3索引结构

索引是在MySQL的存储引擎层中实现的,而不是在服务器层中实现的。因此,不同的存储引擎支持的索引是不同的。

InnoDB默认支持的是:B+Tree索引。

2.3.1 BTree树

在这里插入图片描述
BTree:多路平衡搜索树。一棵M叉的BTree 特性 如下:

  • 每个节点最多包含m个孩子
  • 所有叶子节点都在同一层。
  • 每个节点的数据块最多为m-1个。(如一个5叉树中,一个节点最多有4个数据块)

BTree的演变过程:
若一个节点的数据个数为5个,那么就要向上进行分裂。

BTree 和 二叉树相比,查询效率更高。因为:相同的数据记录量来说,BTree的层级更小,只需要少量的比较就能搜索到目标数据,需要的IO次数更少。

2.3.2B+Tree结构

在这里插入图片描述
B+Tree是BTree的变种,B+Tree与BTree的区别是:

  • n叉的B+Tree中每个节点最多有n个数据块(n个key),而BTree每个节点最多有n-1个数据块。
  • 所有的数据块(key/索引值)的信息都存在于叶子节点,叶子节点跟表数据相关联。
  • 而非叶子节点起到一个索引的作用,用来查找到叶子节点,进而查找到对应的数据。
  • B+Tree查询效率更加稳定。//因为查询数据都要从root 走到 叶子节点来查询。

2.3.3MySQL中的B+Tree

Mysql中的索引数据结构 对 原有的B+Tree进行了优化。在原有的基础上,给叶子节点之间增加了一个链表指针,可以提高区间查询的效率

2.4索引分类:

1)单列索引:索引只包含一个字段
2)复合索引:索引包含多个字段
3)唯一索引:索引列的值唯一,但允许有1个空值。

2.6索引的设计原则

  • 经常查询的表,数据量比较大的表适合 建立索引。
  • 索引字段的选择:经常用作where条件的字段适合 建立索引。
  • 尽量给字段添加唯一索引,区分度高,效率高。
  • 索引不是越多越好,索引越多,更新数据表时代价太大。
  • 使用短字段的索引
  • 如果建立了组合索引,那么就可以利用最左前缀来提升查询效率。

4、索引的使用

4.1分析sql语句的执行情况,我们使用Explain工具

4.2索引的使用

假设一个表有A、B、C、D、E 这5个字段,我们给A、B、C这三个字段建立一个组合索引。

4.2.1避免索引失效

1)全索引匹配(不失效
where 条件中含有 A、B、C 这三个条件时。就使用的是全索引匹配,复合索引中的每一个索引都是有效的。

2)最左前缀法则(索引不失效
只要where条件为下列的3种的其中一种,都走的是复合索引。只不过索引的字段长度不一样(用explain工具分析得出…)。
即:where后的条件为3种:

  • A 索引字段长度403 只走A索引
  • A、B 410 走AB索引
  • A、B、C 800 走ABC索引
    若为A、C:也会走复合索引,但是只走A索引,索引C是失效的,不起作用的。索引字段长度跟索引A的长度一样为403.

3)范围查询右边的列索引失效
在这里插入图片描述
4)在索引列上运算,索引失效。如:+ - like在这里插入图片描述

5)索引字段是字符串类型,若使用时,没加单引号 ‘ ’ ,就会造成索引失效。
因为底层 会进行隐式转换,把int转为varchar,相当于对字段做了运算,因此,索引失效。
在这里插入图片描述

6)尽量使用覆盖索引,避免select * ,多使用select 复合索引中的索引列。
因为select * 的话,当查找到索引列时,还要回调,去找到对应记录的所有数据。
若使用select 索引列的话,当找到索引列时,就找到了要的数据,直接就返回了。

在这里插入图片描述

7)条件为:索引列 or 非索引列。// 【索引失效,不使用索引 】
and的话 不失效。
在这里插入图片描述

8)模糊匹配,%加在前面的话,【索引失效】。
解决:使用覆盖索引。即:查寻的列为 索引列。在这里插入图片描述

9)如果MySQL评估使用索引比全表扫描还慢,则就不使用索引。
即:一张表中有100条记录,给address字段添加索引,有99条记录的address字段值都为 “ 北京市 ” ,只有一条记录的值为 “ 西安市 ” 。
那么当使用索引列address=“北京市”进行查询时,就不会走索引,而是直接全表扫描。

【注意:】 它是根据 字段的特殊性,若字段值占了多数,where条件为该值时,就不会走索引,而是走全表扫描。

在这里插入图片描述

10)is null ,is not null ,有时索引失效。跟 9)情况一样。
11)in走索引,而not in 不走索引。
在这里插入图片描述

12)尽量使用复合索引,少使用单列索引。
为什么呢?
答: 我们创建了一个复合索引A、B、C,,就相当于是创建了3个索引,即:A AB ABC。若创建的不是复合索引,而是给每个字段创建单个的索引,那么在使用时,在where条件中同时出现了这 3个字段,那么数据库会选择一个最优的索引来使用,并不会使用全部索引。

  • 最优的索引选择:选择辨识度最高的索引字段。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值