iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL中的索引有哪些类型或者种类
  • 536
分享到

MySQL中的索引有哪些类型或者种类

2024-04-02 19:04:59 536人浏览 泡泡鱼
摘要

本文主要给大家简单讲讲Mysql中的索引有哪些类型或者种类,相关专业术语大家可以上网查查或者找一些相关书籍补充一下,这里就不涉猎了,我们就直奔主题吧,希望mysql中的索引有哪些类型或者种类这篇文章可以给大

本文主要给大家简单讲讲Mysql中的索引有哪些类型或者种类,相关专业术语大家可以上网查查或者找一些相关书籍补充一下,这里就不涉猎了,我们就直奔主题吧,希望mysql中的索引有哪些类型或者种类这篇文章可以给大家带来一些实际帮助。

                                                           MySQL中的索引有哪些类型或者种类

什么是索引

索引是一种数据结构,其作用就是用来提高数据查询效率。比较常用的比喻就是将其类比为书籍的目录。通过目录可以精确的找到某一章节的内容所在页。

在数据量较小的时候使用索引其实也没有什么意义,即使没有索引需要一条一条遍历数据对于计算机来说也并不需要太多时间。而一旦数据量较大,要保证我们能正常的对外提供服务,保证用户使用体验那么索引就是必要的了。

索引类型

索引是一种数据结构,为了应对不同的场景会有多种实现。在Mysql中主要就是Hash索引和B+Tree。

Hash索引

hash相信大家应该都很熟悉,hash是一种key-value形式的数据结构。实现一般是数组+链表的结构,通过hash函数计算出key在数组中的位置,然后如果出现hash冲突就通过链表来解决(拉链法)。当然还有其他的解决hash冲突的方法。hash这种数据结构是很常用的,比如我们系统使用HashMap来构建热点数据缓存,存取效率很好。

hash结构存数据首先通过计算key的hash值来确定其在数组中的位置,如果有冲突就在该数组位置建一个链表。这样很明显有几个问题:

即使是具有相同特征的key计算出来的位置可能相隔很远,连续查询效率低下。即不支持范围查询。

hash索引存储的事计算得到的hash值和行指针,而不存储具体的行值,所以通过hash索引查询数据需要进行两次查询(首先查询行的位置,然后找到具体的数据)

hash索引查询数据的前提就是计算hash值,也就是要求key为一个能准确指向一条数据的key,所以对于like等一类的匹配查询是不支持的。

所以我们可以知道的是hash索引适用于快速选取某一行的数据。

B+Tree结构

从名字上看这明显是一种树结构,在大学期间数据结构的课本上树结构是必讲的。树结构是一种特别重要的数据结构,在很多地方都会使用到。

上面我们说到hash索引无法进行范围查询,在树结构中也有一种方便进行有序查询的结构--二叉搜索树。二叉搜索树的结构中要求父节点的值大于左孩子节点并且小于右孩子节点,如下图:

MySQL中的索引有哪些类型或者种类

上图中二叉树的查询的时间复杂度为O(log(n)),当然要保证O(log(n))的时间复杂度就需要保证二叉树时刻保持平衡。

而在MySQL索引中虽然也使用了树结构,但是并不是使用的二叉树。因为在数据库中数据最终都是存放在磁盘上的,而如果树的节点过多的话,那么在节点之间转移会花费较多的时间。在MySQL的实现中选择将更多内容放在同一个节点,对同一个节点的操作转入在内存中完成,减少在外存中节点之间转移的次数,以达到提高效率的目的。这就是B+Tree,在B+Tree的实现中一个三层的树结构就基本上可以满足我们几乎所有的需求了。

相关推荐:《mysql数据库知识学习

B-Tree

要了解B+Tree首先就得了解B-Tree,B-Tree是一种平衡树,这里的B指的是Balance而不是Binary,更确切的说B-Tree是一种多路平衡搜索树。

多路平衡搜索树如下图:

MySQL中的索引有哪些类型或者种类

这是一种2-3树,意思就是每个节点存有两个值,同时每个节点分支数为3,从上图中可以看出来着中结构很适合查询数据。每个节点的左子树的值都是小于当前节点中最小的值,中间的子树的值全都是在当前节点两个值的中间,而右子树的值全都大于当前节点的最大值。

比如我们要查找24这个值:

(1)首先从根节点判断24在根节点(15,25)之间,所以左右子树排除,从中间查找。

(2)然后找到中间子树的根节点(18,22),比较发现24大于该节点最大值,排除左子树和中间子树。

(3)找到右子树,判断节点大值刚好等于24,查询结束。

基于上面的流程可以总结B树的搜索:

(1)从根结点开始,对结点内的关键字(有序)序列进行二分查找。

(2)如果命中则结束,否则进入查询关键字所属范围的子结点;

(3)重复上面的流程,直到所对应的子节点为空,或已经是叶子结点;

可以看出其搜索性能相当于在关键字集合内做一次二分查找。从这里看来好像B-Tree没有什么问题,但是需要注意到的是在B-Tree中每一个节点都是存储索引关键字以及其代表的具体行数据。而在MySQL中数据库加载数据是以页为单位加载,每一页的大小是固定的(默认16k)。如果每一个节点都存储所有的值,那么一页中能存下的节点就会很少,一次查询可能就会进行多次从内存中去加载数据,导致性能降低。

B+Tree

B+Tree是对B-Tree的一个变种,让其更加适应于进行外部存储文件索引。

两者之前最大的不同就在于B-Tree的每个节点都存储所有的数据,而B+Tree需要存储的数据都在叶子节点上,并且增加了顺序访问指针,每个叶子节点都有指向下一个相邻的叶子节点的地址。这样的结构保证了在一个内存页中可以存下更多的索引节点,并且更加适合进行范围查询。

索引

因为存储引擎负责实现索引,所以接下来讨论索引都是基于MySQL的InnoDB引擎。

聚簇索引

聚簇的意思是表示数据行和相邻的键值聚簇的存储在一起。一些数据库允许选择具体的某一个索引作为聚簇索引,而在InnoDB的实现中直接将主键索引指定为聚簇索引。如果没有定义主键,InnoDB 会选择一个唯一的非空索引来代替主键索引。如果同样没有定义这样的索引,InnoDB会隐式定义一个主键来作为聚簇索引(row_id)。

聚簇索引实例如图:

MySQL中的索引有哪些类型或者种类

非聚簇索引索引

在InnoDB中除主键索引外其他都是非聚簇索引,所以也叫非主键索引。非主键索引的叶节点并不是存储一行的值,而是存储具体行的主键值。不满足聚簇的定义。

非聚簇索引实例如图:

MySQL中的索引有哪些类型或者种类

聚簇索引和非聚簇索引在查询时的差异

由上面的两种索引实例图就可以看出来,在查询时如果是通过主键索引查询的话直接查询到数据行然后返回。但是如果是通过非主键索引查询的话首先需要通过该索引确定主键,然后通过得到的主键从主键索引中查到具体行的数据,后面的通过得到的主键从主键索引中获取数据的过程被称为回表。

回表的过程使得通过普通索引查询较主键索引查询多了一步,在很多情况下效率相对较低。所以在我们的查询过程中如果能够仅通过主键确定数据那最好就是直接使用主键进行查询。

覆盖索引

上面介绍了通过非主键查询会有一个回表的过程,但是需要注意的是并不是每一个查询都存在回表这一步,对于一个普通索引来说其叶节点存储的是主键的值,那么假设我现在需要的数据也仅仅就是主键的值呢?通过普通索引取到主键的值后就并不需要再到主键索引中查,那么也就不存在回表这一过程了。

上面例子中该非主键索引已经存在了我们所需要的值,所以该索引也被称为覆盖索引。覆盖索引并不是一个固定的结构,可以使单索引(一个字段的索引),也可以使复合索引,凡是能够直接提供查询结果而不需要进行回表过程的都可以被称为覆盖索引。

很多时候我们不可能仅仅通过主键来确定数据,使用普通索引可能会导致低效,所以覆盖索引在日常开发过程中也是一个很常用的性能优化的手段。

当然覆盖索引页并不都是好的,比如我现在建立了一个索引index(a,b)。由a,b两个字段来建立索引,好处已经说过了就是查询ab字段时不会回表,但是如果仅仅通过b字段来查询就无法走这个索引了。建立的索引的索引项是按照索引定义里面出现的字段顺序排序的。

最左前缀原则

假设现在存在索引index(a,b),那么如果通过a和b来查询能够应用该索引,单独使用a来查询也能应用到该索引,但是如果单独使用b来查询则无法应用到该索引。这就是最左前缀原则,在匹配索引时回匹配索引最左边的n个字段,能匹配上就可以应用该索引。

由于最左前缀原则的存在也就要求我们在建立索引时可能需要考虑更多的事情。

首先需要清楚的事索引是一种数据结构,建立索引时需要消耗存储空间的,所以索引并不是建立的越多越好,而是应该根据需求尽可能的减少索引的数量。

而最左前缀原则的存在就使得一个联合索引可以被当成多个索引来使用,当然前提是设计好索引中字段的顺序(实际上最左前缀原则也并不是仅仅适用于联合索引,对于字符串索引也使用,字符串索引中最左n个字符相当于联合索引中的最左n个字段)。

比如index(a,b),有了这个索引后我们就不需要单独为a建立索引,所以在设计联合索引时一般将使用频率较高的字段放在前面。

然后是将区分度较高的字段靠前,区分度就是字段中值的重复率,重复率越低区分度越高。比如性别就不适合作为索引,区分度越高的字段经过一次筛选能过滤掉更多的行。

然后还需要考虑的是字段的大小,由于索引也需要占据空间所以一般选用较小的字段。

MySQL中的索引有哪些类型或者种类就先给大家讲到这里,对于其它相关问题大家想要了解的可以持续关注我们的数据库。我们的板块内容每天都会捕捉一些行业新闻及专业知识分享给大家的。

您可能感兴趣的文档:

--结束END--

本文标题: MySQL中的索引有哪些类型或者种类

本文链接: https://www.lsjlt.com/news/34666.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL中有哪些索引类型
    本篇文章给大家分享的是有关MySQL中有哪些索引类型,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1.B-Tree索引因为存储引擎不⽤进⾏全表扫描来获取数据,直接从索引的根节点...
    99+
    2023-06-14
  • mysql索引类型有哪些
    这篇“mysql索引类型有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“mysql索引...
    99+
    2024-04-02
  • mysql索引类型有哪些?
    在Mysql数据库当中,我们经常会谈到Sql语句,当然也会谈到索引优化,那么在数据库当中有哪些索引类型呢,博主在这里进行分享,希望对大家能有所帮助。 目录 1、B-Tree索引: 2、Hash索引: 3、Full-text索引: 4、...
    99+
    2023-09-07
    数据库
  • mysql的索引有哪些类型
    mysql索引可快速查找数据,通过在键值对中存储列值和数据指针实现。常见的索引类型有:b-tree索引:支持范围查询,数据量大时性能佳。哈希索引:完全匹配查询快,但更新数据开销大。全文索...
    99+
    2024-04-22
    mysql 键值对
  • 不同类型的MySQL索引有哪些?
    MySQL索引是提高查询效率的重要工具,它可以加快数据检索速度。下面详细介绍了MySQL中的几种常见索引,并提供了具体的代码示例。 主键索引(Primary Key Index):主键...
    99+
    2024-02-22
    全文索引 哈希索引 mysql索引 地理位置
  • Teradata中的索引类型有哪些
    在Teradata中,常见的索引类型包括: 主索引(Primary Index):每个表只能有一个主索引,用于确定数据行在AMP...
    99+
    2024-04-02
  • DynamoDB的索引类型有哪些
    DynamoDB 的索引类型有两种:局部索引(Local Secondary Index,LSI)和全局索引(Global Seco...
    99+
    2024-04-09
    DynamoDB
  • oracle索引类型有哪些
    oracle索引类型有:1、B-Tree索引;2、位图索引;3、函数索引;4、哈希索引;5、反向键索引;6、局部索引;7、全局索引;8、域索引;9、位图连接索引;10、复合索引。详细介绍:1、B-Tree索引,是一种自平衡的、可以高效地支持...
    99+
    2023-11-16
    oracle 索引
  • python索引类型有哪些
    python中索引的类型:1.普通索引,最基本的索引;2.唯一索引,不允许其中任何两行具有相同索引值的索引;3.主键索引,唯一索引的特定类型;4.复合索引,多个字段上创建的索引;python中索引的类型有普通索引、唯一索引、主键索引和复合索...
    99+
    2024-04-02
  • mysql的索引有哪些类型和特点
    mysql索引类型包含:1. b-tree 索引:快速等值、范围及前缀搜索;2. 哈希索引:快速等值搜索;3. 全文索引:模糊搜索文本字段;4. 空间索引:地理空间查询;5. 覆盖索引:...
    99+
    2024-04-22
    mysql 键值对
  • mysql数据库索引类型有哪些
    这篇文章主要介绍mysql数据库索引类型有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!本文将着重描述masql数据库索引的四种类型,数据库索引怎么建立?在WHERE和J...
    99+
    2024-04-02
  • mysql索引的分类有哪几种
    mysql 索引分为以下类型:1. 普通索引:匹配值、范围或前缀;2. 唯一索引:确保值唯一;3. 主键索引:主键列的唯一索引;4. 外键索引:指向另一表主键;5. 全文索引:全文搜索;...
    99+
    2024-04-22
    mysql mysql索引
  • mysql 索引类型有哪些,分别有哪些作用
    MySQL 支持多种索引类型,每种类型都有其特定的用途和优势。以下是 MySQL 中常见的索引类型及其作用:B-Tree 索引(默认)作用:B-Tree 索引是最常见的索引类型,用于加速数据的检索速度。特点:B-Tree 索引能够保持数据的...
    99+
    2024-03-08
    索引 mysql索引类型
  • mysql中索引有什么类型
    这篇文章主要介绍mysql中索引有什么类型,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!MySQL目前主要有的索引类型为:普通索引、唯一索引、主键索引、组合索引、全文索引。下面本篇文...
    99+
    2024-04-02
  • Oracle数据库中有哪些索引类型
    今天就跟大家聊聊有关Oracle数据库中有哪些索引类型,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、B-Tree索引三大特点:高度较低、存储列值...
    99+
    2024-04-02
  • mysql存储引擎的类型有哪些
    MySQL存储引擎的类型有以下几种: InnoDB:支持事务处理,具有较好的性能和可靠性,适合大型数据库应用。 MyISAM:不支...
    99+
    2024-04-09
    mysql
  • Couchbase支持哪些类型的索引
    Couchbase支持以下类型的索引: GSI(Global Secondary Index)全局二级索引:在整个集群中可用,用...
    99+
    2024-03-08
    Couchbase
  • mysql的索引类型和索引方法
    mysql 索引类型包括普通索引、唯一索引、全文索引、空间索引和哈希索引。索引方法有 btree、hash 和 rtree。选择合适的索引类型和方法取决于数据类型和查询模式,例如范围查找...
    99+
    2024-04-22
    mysql
  • 数据库常用的索引类型有哪些
    常用的数据库索引类型包括:1. B-树索引:B-树(Balanced Tree)是一种平衡的多路搜索树,常用于关系型数据库中的索引结...
    99+
    2023-09-05
    数据库
  • Java中有哪些引用类型
    Java中有哪些引用类型?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。强引用强引用是最常用的引用类型,如下所示,new Object()会创建一个Object对象并存储在堆...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作