索引对数据库有多重要,我想大家都已经知道了吧,关于索引可能大家会对它多少有一些误解,首先索引是一种数据结构,并且索引不是越多越好。合理的索引可以提高存储引擎对数据的查询效率。

形象一点来说呢,索引跟书本的目录一样,能否快速的查找到你需要的信息,取决于你设计的目录是否合理。

MySQL 数据库有很多种索引,每种存储引擎的索引都不太一样,这篇文章就介绍一下 InnoDB 引擎种的索引,在 InnoDB 引擎中有三种索引:

  • B-Tree 索引
  • 哈希索引
  • 全文索引

B-Tree 索引

B-Tree 索引是 InnoDB 引擎的默认索引,如果我们没有特别指定索引,那么说的就是 B-Tree 索引。在 InnoDB 引擎中使用 B+树来实现 B-Tree 索引,关于 B+树的知识就百度吧,我也讲不清楚。

在 B-Tree 索引中又有主键索引和普通索引之分,分别来了解一下:

1、主键索引

主键索引也叫聚集索引,是按照主键构建得一棵 B+树,只要建立了主键就会自动加上索引,主键索引得特点是:叶子节点上存放着整张表得行记录数据,所以叶子节点也叫数据页

正是因为这个特点,对于主键的排序查找和范围查找速度非常快,因为索引上就有用户需要查询的数据,所以不会要回表查询,这样就加快了查询速度,关于什么是回表,普通索引的时候再聊一聊。

2、普通索引

普通索引也叫二级索引,跟主键索引的主要区别在于叶子结点没有存放行记录的全部数据,只包含了需要的键值,还有一个标签,用来告诉存储引擎在哪里可以找到这行数据。

举个例子,让我们刚好的理解普通索引,如下面这张表:

mysql> create table T(
id int primary key,
k int not null,
name varchar(16),
index (k)) engine=InnoDB;

K 索引就是普通索引,除了主键之外的索引都是普通索引。

普通索引因为行记录里没有数据的全部信息,在使用普通索引查询时,需要现在普通索引树上搜索一遍,再回到主键索引树上查询到需要的信息,这个过程也叫回表

可能回表不太好理解,我引用极客时间《MySQL实战45讲》里面的例子,先看下面这张图:

左边的是主键索引树,右边的是 K 索引树,假设我们现在要执行select * from T where k=5 语句,即普通索引查询方式,则需要先搜索 k 索引树,得到 K=5 对应的 ID 值为 500,再到 ID 索引树搜索一次,这个过程称为回表。

哈希索引

哈希索引在 InnoDB 引擎中叫作自适应哈希索引,它是由数据库自身根据你的使用情况创建的,并不能认为的干预,所以叫作自适应哈希索引,采用的是哈希表数据结构,所以对于字典类型查询就非常的快,但是对于范围查询就无能为力啦。

全文索引

在 B-Tree索引中,当我们执行 select * from blog where content like %xxxx% 语句时,索引会失效。全文索引可以有效的解决这种语句查询。

全文索引是一种比较特殊的索引,一般都是基于倒排索引来实现的,es 也是使用倒排索引。倒排索引跟 B-Tree 索引一样也是一种数据结构,在辅助表中存储了单词与单词自身在一个或多个文档中所在位置的映射。

现在有很多专门做全文索引的软件,例如 solr、elasticsearch等,MySQL 中的全文索引实现原理跟这些差不多。

以上就是关于 InnoDB 引擎中的索引类型,感谢您的阅读,希望这篇文章对您的学习或者工作有所帮助。

最后

目前互联网上很多大佬都有 MySQL 相关文章,如有雷同,请多多包涵了。原创不易,码字不易,还希望大家多多支持。若文中有所错误之处,还望提出,谢谢。

欢迎扫码关注微信公众号:「平头哥的技术博文」,和平头哥一起学习,一起进步。

聊一聊 InnoDB 引擎中的索引类型的更多相关文章

  1. InnoDB 引擎中的索引类型

    首先索引是一种数据结构,并且索引不是越多越好.合理的索引可以提高存储引擎对数据的查询效率. 形象一点来说呢,索引跟书本的目录一样,能否快速的查找到你需要的信息,取决于你设计的目录是否合理. MySQL ...

  2. 聊一聊 InnoDB 引擎中的这些索引策略

    在上一篇中,我们简单的介绍了一下 InnoDB 引擎的索引类型,这一篇我们继续学习 InnoDB 的索引,聊一聊索引策略,更好的利用好索引,提升数据库的性能,主要聊一聊覆盖索引.最左前缀原则.索引下推 ...

  3. InnoDB引擎中的索引与算法9

    5.1 InnoDB支持以下几种常见的索引: B+树索引 全文索引 哈希索引(自适应哈希索引) 关于哈希索引的说明: -- 1.InnoDB的哈希索引是自适应的,其根据表的使用情况自动生成哈希索引,不 ...

  4. MyISAM、InnoDB、Memory这3个常用引擎支持的索引类型

    表格对比了MyISAM.InnoDB.Memory这3个常用引擎支持的索引类型: 索引 MyISAM引擎 InnoDB引擎 Memory引擎 B-Tree索引 支持 支持 支持 HASH索引 不支持 ...

  5. Innodb引擎中Count(*)

    select count(*)是MySQL中用于统计记录行数最常用的方法,count方法可以返回表内精确的行数. 在某些索引下是好事,但是如果表中有主键,count(*)的速度就会很慢,特别在千万记录 ...

  6. 为什么 select count(*) from t,在 InnoDB 引擎中比 MyISAM 慢?

    统计一张表的总数量,是我们开发中常有的业务需求,通常情况下,我们都是使用 select count(*) from t SQL 语句来完成.随着业务数据的增加,你会发现这条语句执行的速度越来越慢,为什 ...

  7. MySQL InnoDB引擎B+树索引简单整理说明

    本文出处:http://www.cnblogs.com/wy123/p/7211742.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错 ...

  8. MySQL查看 InnoDB表中每个索引的高度

    我们都知道MySQL里,索引通常用B+树来实现的.B+树的叶子结点才具体保存数据(聚簇索引保存的是行数据:普通索引是主键,如有需要得回表),非叶子结点都是用来索引叶子结点的.假设索引高度为h,那么每次 ...

  9. 【Mysql】InnoDB 引擎中的数据页结构

    InnoDB 是 mysql 的默认引擎,也是我们最常用的,所以基于 InnoDB,学习页结构.而学习页结构,是为了更好的学习索引. 一.页的简介 页是 InnoDB 管理存储空间的基本单位,一个页的 ...

随机推荐

  1. samba 部署与实验

    一.本地用户登录 1.本地用户验证(Samba服务器默认的安全级别,用户在访问共享资源之前必须提供用户名和密码进行验证) 拓展:tdbsam:该方式是使用一个数据库文件来验证.数据库文件叫passdb ...

  2. Dubbo-本地测试直连

    一.服务提供方 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http: ...

  3. Python自定义函数的参数

    在Python中自定义的函数可以有三类不同的参数 formal parameters positional arguments Keyword Arguments When a final forma ...

  4. HBase 分裂(split)

    1. 为什么split 最初一个Table 只有一个region(因此只能存放在一个region server上).随着数据的不断写入,HRegion越来越大,当到达一定程度后分裂为两个,通过负载均衡 ...

  5. Deep Learning ——Yann LeCun,Yoshua Bengio&Geoffrey Hinton

    引言: 深度学习的本质是用多层的神经网络找到一个可以被学习的复杂的函数实现语音识别,图像识别等功能. 多层神经网络的结构: 多层神经元的组成,每一层的输入都等于上一层的输出. 应用领域:cv,nlp ...

  6. HashMap面试题解答

    一.HashMap的实现原理? 此题可以组成如下连环炮来问 你看过HashMap源码嘛,知道原理嘛?为什么用数组+链表?hash冲突你还知道哪些解决办法?我用LinkedList代替数组结构可以么?既 ...

  7. 002 ceph的deploy部署

    介绍:前期对ceph有一个简单的介绍,但是内容太大,并不具体,接下来使用ceph-deploy部署一个Ceph集群,并做一些运维管理工作,深入的理解Ceph原理及工作工程! 一.环境准备 本次使用的虚 ...

  8. 【一起学源码-微服务】Nexflix Eureka 源码十二:EurekaServer集群模式源码分析

    前言 前情回顾 上一讲看了Eureka 注册中心的自我保护机制,以及里面提到的bug问题. 哈哈 转眼间都2020年了,这个系列的文章从12.17 一直写到现在,也是不容易哈,每天持续不断学习,输出博 ...

  9. $Poj1821\ Fence\ $单调队列优化$DP$

    Poj   Acwing Description 有N块木板等待被M个工匠粉刷,每块木板至多被刷一次.第i个工匠要么不粉刷,要么粉刷包含木块Si的,长度不超过Li的连续的一段木板,每粉刷一块可以得到P ...

  10. JAVA的引用类型

    一.强引用 JAVA默认的引用类型,强引用,是在我们的开发工作当中普遍存在的.如果一个对象具有强引用,当内存空间不足的时候,java虚拟机宁可抛出OOM异常,也不会回收它来释放内存.但是我们可以将对象 ...