索引对数据库有多重要,我想你们都已经知道了吧,关于索引可能你们会对它多少有一些误解,首先索引是一种数据结构,而且索引不是越多越好。合理的索引能够提升存储引擎对数据的查询效率。java
形象一点来讲呢,索引跟书本的目录同样,可否快速的查找到你须要的信息,取决于你设计的目录是否合理。mysql
MySQL 数据库有不少种索引,每种存储引擎的索引都不太同样,这篇文章就介绍一下 InnoDB 引擎种的索引,在 InnoDB 引擎中有三种索引:sql
B-Tree 索引是 InnoDB 引擎的默认索引,若是咱们没有特别指定索引,那么说的就是 B-Tree 索引。在 InnoDB 引擎中使用 B+树来实现 B-Tree 索引,关于 B+树的知识就百度吧,我也讲不清楚。数据库
在 B-Tree 索引中又有主键索引和普通索引之分,分别来了解一下:微信
主键索引也叫汇集索引,是按照主键构建得一棵 B+树,只要创建了主键就会自动加上索引,主键索引得特色是:叶子节点上存放着整张表得行记录数据,因此叶子节点也叫数据页。数据结构
正是由于这个特色,对于主键的排序查找和范围查找速度很是快,由于索引上就有用户须要查询的数据,因此不会要回表查询,这样就加快了查询速度,关于什么是回表,普通索引的时候再聊一聊。elasticsearch
普通索引也叫二级索引,跟主键索引的主要区别在于叶子结点没有存放行记录的所有数据,只包含了须要的键值,还有一个标签,用来告诉存储引擎在哪里能够找到这行数据。学习
举个例子,让咱们恰好的理解普通索引,以下面这张表:设计
mysql> create table T( id int primary key, k int not null, name varchar(16), index (k)) engine=InnoDB;
K 索引就是普通索引,除了主键以外的索引都是普通索引。code
普通索引由于行记录里没有数据的所有信息,在使用普通索引查询时,须要如今普通索引树上搜索一遍,再回到主键索引树上查询到须要的信息,这个过程也叫回表。
可能回表不太好理解,我引用极客时间《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 相关文章,若有雷同,请多多包涵了。原创不易,码字不易,还但愿你们多多支持。若文中有所错误之处,还望提出,谢谢。
欢迎扫码关注微信公众号:「平头哥的技术博文」,和平头哥一块儿学习,一块儿进步。