mysql索引

面试官问了我关于索引的问题,答的不太好,故记录一下。

概念

索引:可以理解为书的目录,它是一种数据结构,目的是mysql支持我们更加高速高效的获得想要的数据。综上,说明索引的使用场景一般是大量数据时才高可用。

索引的划分

由于存储引擎的不同,我们通过四个方面划分,分别为:
按数据结构分类:B+树索引,Hash索引,Full-text索引。
按物理存储分类:聚集索引,非聚集索引(二级索引、辅助索引)。
按字段特性分类:主键索引(PRIMARY KEY)、唯一索引(UNIQUE)、普通索引(INDEX)、全文索引(FULLTEXT)
按字段个数分类:单一索引,联合索引(复合索引、组合索引)
我们主要说一下按字段特性分类以及按数据结构分类这两种。

按数据结构分类

  1. B+树索引
    在这里插入图片描述
    如果熟悉数据结构的小伙伴就能发现,出去底层双向链表的结构,B+树就变成了二叉树。
    B+树在非叶子节点中只存储索引,而数据实际上都存储在叶子节点上,其次,数据页与数据页之间采用双向链表,数据页内部采用单向链表。因此,我们得知了B+树索引的优势:
    优势一:非叶子节点存储索引更多,则树在结构上更矮更大,通俗的说,树的层数越少,检索速度越快。(而b树在这里的不同处就是非叶子节点不仅存储索引,还存储指向数据的指针,故B树在树的层数上多于B+树,而层数,可以大致理解为IO次数,这在数据库优化中很重要)
    优势二:所有数据都有序的记录在叶子节点上,则排序、范围、去重等等查询更加简单便捷。
    优势三:数据页之间、数据记录之间都是通过链表链接的,有了这个结构的支持就可以方便的在数据查询后进行升序或者降序操作
  2. Hash索引
    详细的原理这里不多说,因为笔者研究也不深,不如举一个现实点的例子:
    在这里插入图片描述

Hash索引实际上就是把键值替换成了由hash算法得出的hash值,映射至对应槽位,并存储再哈希表(在内存中)中。如果出现多组hash值一样的数据,就会出现hash碰撞,可以通过链表来解决这个问题。
故:我们得知了hash索引的优缺点:
优势一:查询速度,在不会出现大批量hash冲突的情况下(重复数据多的字段使用hash索引的场景,比如性别),查询速度一般快于B+树索引,因为hash表查询key一次查询即可,且hash表在内存中,不需要IO。
缺点一:只支持等值查询。不支持范围查询
缺点二:无法利用索引排序,hash是无序的。
缺点三:内存开销(数据过多时),因为hash表都存储在内存中,需要记录所有记录键,这对内存大小有一定要求。
3. Full-text索引 (全文索引)
Full-text索引一般使用倒排索引实现。倒排索引同B+tree索引一样,也是一种索引结构。实际上,叫反向索引更贴切。为什么呢?
举个例子:
如果我们要在某一个varchar类型的名称字段列中找到包含某个值的数据,那么,一般逻辑是:
select * from table where column like 'aaa%'
那么,从数据中查你想要的单词,这就是正向索引。
反之,根据单词查关联数据,就是反向索引。
最直接的例子就是:
举个例子,你想一本关于sql优化-索引的书,那么你的查询方式一般是:
打开目录找到索引找到页码,而不是每一页都去翻找索引这两个字。
当然,这是最简单的理解,倒排索引的实现还有很多内容,这里不细说了,我们主要说它的优缺点。
优势一:对于文本类型的大对象,或是char类型的较大数据,倒排索引具有明显的优势。感兴趣的可以去了解一下like语句的原理和倒排索引的原理。
缺点一:mysql的InnoDB存储引擎5.6.4版本之前不支持该索引。

按字段特性划分

MySQL索引按字段特性分类可分为:主键索引(PRIMARY KEY)、唯一索引(UNIQUE)、普通索引(INDEX)、全文索引(FULLTEXT)。

  1. 主键索引(PRIMARY KEY)
    建立在主键上的索引被称为主键索引,一张数据表只能有一个主键索引,索引列值不允许有空值,通常在创建表时一起创建。

  2. 唯一索引(UNIQUE)
    建立在UNIQUE字段上的索引被称为唯一索引,一张表可以有多个唯一索引,索引列值允许为空,列值中出现多个空值不会发生重复冲突。

  3. 普通索引(INDEX)
    建立在普通字段上的索引被称为普通索引。

  4. 全文索引(FULLTEXT)
    MyISAM 存储引擎支持Full-text索引,用于查找文本中的关键词,而不是直接比较是否相等。Full-text索引一般使用倒排索引实现,它记录着关键词到其所在文档的映射。就是上文提到的倒排索引。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值