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

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

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. js基础——基本包装类型

    1.基本包装类型String   var bz = new String("Li.Linda"); //引用类型(object)         bz.name= bz.subst ...

  2. git 安装及基本配置

    git 基本上来说是开发者必备工具了,在服务器里没有 git 实在不太能说得过去.何况,没有 git 的话,面向github编程 从何说起,如同一个程序员断了左膀右臂. 你对流程熟悉后,只需要一分钟便 ...

  3. yum安装gcc和gcc-c++

    本次总结参考 博客:http://blog.csdn.net/robertkun/article/details/8466700  ,非常 感谢他的博客,帮我解决了问题. 今天安装gcc-c++时出现 ...

  4. H3C查看、删除已经保存配置文件--用户图示(console)以上

    <H3C>display saved-configuration    //显示已经保存的内容 <H3C>reset saved-configuration      //删除 ...

  5. I/O 寄存器和常规内存

    不管硬件寄存器和内存之间的强相似性, 存取 I/O 寄存器的程序员必须小心避免被 CPU(或者编译器)优化所戏弄, 它可能修改希望的 I/O 行为. I/O 寄存器和 RAM 的主要不同是 I/O 操 ...

  6. Vue中通过属性绑定为元素绑定style行内样式

    1.直接在元素上通过:style的形式,书写样式对象 2.将样式对象定义在data中,并直接引用到:style中 3.在:style中通过数组,引用多个data上的样式对象

  7. Vue生命周期学习总结

    官方文档上关于Vue生命周期的图片大家一定很熟悉: 1.beforeCreate 实例.组件通过new Vue() 创建出来之后会初始化事件和生命周期,然后就会执行beforeCreate钩子函数,这 ...

  8. dotnet 特性 DynamicallyInvokable 是用来做什么的

    我在 Linq 很多函数都看到 __DynamicallyInvokable 这个特性,这是一个没有官方文档的特性,也许是用来优化反射 在堆栈 网找到了以下描述 这个 __DynamicallyInv ...

  9. 2016湖南省赛 I Tree Intersection(线段树合并,树链剖分)

    2016湖南省赛 I Tree Intersection(线段树合并,树链剖分) 传送门:https://ac.nowcoder.com/acm/contest/1112/I 题意: 给你一个n个结点 ...

  10. LeetCode111_求二叉树最小深度(二叉树问题)

    题目: Given a binary tree, find its minimum depth.The minimum depth is the number of nodes along the s ...