Mysql 索引

索引的用处

索引就是为了提高数据查询的效率,就像书的目录一样。让搜索引擎刻印根据目录告诉访问他想去找的地方

常见的索引模型

  1. 哈希表
  2. 有序数组
  3. 搜索树

哈希表

哈希表 :是一种以键 - 值(key-value)存储数据的结构,我们只要输入key就可以相对应的值即为value。哈希的速录很简单,把值放在数组里,用一个哈希函数把key换算成一个确定的位置,然后把value放在数组的这个位置。当有哈希冲突发生的时候,将多个相同的key的value转换成一个链表。
在这里插入图片描述
如上图中所示,当有新的数据插入时,直接将新值追加在链表的尾端,所以哈希表中的链表内的数据是无序的。当要做范围查找的时候就需要将范围内的所有数据都进行扫描一遍,所以哈希索引做区间查询时的速度很慢

所以哈希表这种结构适用于只有等值查询的场景

有序数组

有序数组 : 在等值查询和范围查询场景中的性能都非常优秀
在一个有序数组中,使用二分法进行查找时间复杂度为O(logN)。
缺点 : 有序数组不太适合进行插入,删除等操作,有序数组索引只适用于静态存储引擎。

二叉搜索树

在这里插入图片描述
有关B+树和B树的区别可以参考
https://blog.csdn.net/BIggyGuan/article/details/107329925

索引优化的过程

索引的节点大小必须要小,这样可以间接减少IO读取的次数,提高查询效率

1 回表

如果执行 SELECT * FROM T where k between 3 and 5


mysql> create table T (
ID int primary key,
k int NOT NULL DEFAULT 0, 
s varchar(16) NOT NULL DEFAULT '',
index k(k))
engine=InnoDB;

insert into T values(100,1, 'aa'),(200,2,'bb'),(300,3,'cc'),(500,5,'ee'),(600,6,'ff'),(700,7,'gg');

首先表中会存储2棵B+ 树,一棵存储主键和数据页的索引树, 一棵存储索引字段和主键的索引树。这其中的过程就会涉及到回表的发生。

  1. 在 k 索引树上找到 k=3 的记录,取得 ID = 300;
  2. 再到 ID 索引树查到 ID=300 对应的 R3;
  3. 在 k 索引树取下一个值 k=5,取得 ID=500;
  4. 再回到 ID 索引树查到 ID=500 对应的 R4;
  5. 在 k 索引树取下一个值 k=6,不满足条件,循环结束。

在这个过程中,返回到主键索引树的过程,就是回表的过程。
查询了K索引树1, 3, 5。回表了2 , 4

2 覆盖索引

为了减少回表的次数,当我们写sql语句应当适当进行优化,例如使用select ID from T where k between 3 and 5 。因为K索引树中存储了 主键ID 和 K, 所以可以直接查询提供查询结果, 不需要回表。索引k已经覆盖了我们的查询需求,我们就成为覆盖索引。

3 最左匹配和联合索引

引擎支持最左匹配原则来减少扫描数据的数量, 提高效率,最左前缀可以是联合索引的最左N个字段,也可以是字符串索引的最左M个字符。联合索引的字段顺序也很重要,(a,b)索引可以省去了建立(a)索引的需求。

4 索引下推

联合索引可以在第一次查询的时候进行筛选,不符合条件的值的数据就直接跳过,不进行回表查询。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值