索引(详细)

索引

基础知识储备

数据一般都会持久化到磁盘,在要操作数据的时候要把磁盘中的数据读入到内存中,在内存中进行相关的处理,但是在内存和磁盘进行交互的时候,不是你想读一个字节就一个字节,有最小的逻辑单元即页,在Innodb这种存储引擎中,默认为16kb。

磁盘预读(预读的长度一般为页的整数倍)
页书存储器的逻辑块,操作系统往往将主存和磁盘存储区分割为连续的大小相等的块,那个存储块为一页(在许多操作系统中,页大小通常为4k),主存和磁盘以页为交换单位交换数据。

索引是什么?

  • 索引是帮助mysql高效获取数据的数据结构
  • 索引存储在文件系统中(那么就会涉及到IO)
    需要考虑减少IO次数
  • 索引的文件存储形式与存储引擎有关
  • 索引的文件的数据结构
    hash(冲突且不适合范围查找)
    二叉树(不论是二叉树还是红黑树,都会因为树的深度变多而造成IO次数变多,影响数据读取效率)
    B树(每个节点放一页数据,B树非页节点存数据)
    B+树

聚簇索引和非聚簇索引

InnoDB中数据和索引合在一起,MyISAM是分开的。
使用InnoDB的时候通过一个键组织数据,有主键的话是主键,没有的话用唯一键,在没有的话使用rowid(隐藏列),所以InnoDB不管怎么都有一个聚簇索引。

聚簇索引叶子节点data放数据,而非聚簇索引叶子节点的data放地址。

回表(会查找两棵树)

mysql默认是给唯一键创建的(唯一且非空),只是主键是唯一键的一个特殊。
现在如果既有唯一键又有主键,主键会创建一棵树,唯一键会再创建一棵树(辅助索引或二级索引),但是叶子节点存放的不会再是整行的记录,而放的是主键(非空唯一键或者rowid),会查找两棵树。

在根据辅助索引或者叫做二级索引进行查找的时候,如果查找辅助索引的列,会先查找根据辅助索引找到主键,再根据主键找到数据,这个过程就称为回表。

如果在数据很少的时候,有的时候使用索引比不使用索引还要慢,可能就是因为回表,因为要查找两棵树

索引覆盖和回表

如果一个索引包含(或覆盖)所有需要查询的字段的值,称为‘覆盖索引’
select id from stu where name =""; //索引覆盖,因为根据name创建的那棵二叉树的值本身就是主键id,所以不需要再去查找。

select id from stu where name =""; //需要查两个表。

覆盖索引例子

stu表的id为主键索引,name为辅助索引

当发起一个索引覆盖查询时,在explain的extra列可以看到using index的信息
在这里插入图片描述

最左匹配(组合索引中使用)

如果索引列包含多个列,那么称为组合索引。

在包含多个列的查询过程中,会依靠先查第一个列,再查第二个列。

如组合索引为name、age,下面的1、2、4会走组合索引。

  • 1、where name = ? and age =?
  • 2、where name=?
  • 3、where age=?
  • 4、where age=? and name=?

MyISAM和InnoDB区别

  • 一个是聚簇索引,一个是非聚簇索引
  • InnoDB支持事务,MyISAM不支持事务。
  • MyISAM只支持表锁,InnoDB既支持表锁,也支持行锁。

索引的分类

  • 主键索引
  • 唯一索引
  • 普通索引
  • 全文索引
  • 组合索引

索引的匹配方式

在这里插入图片描述

要看懂explain的计算方式,可以帮助你分析用了哪些索引

MVCC(多版本并发控制)

索引下推、谓词下推、MRR

看下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值