Mysql索引基本原理[亲测有效]

Mysql索引基本原理[亲测有效]数据库使用过程当中索引的时候必不可少,合理创建索引可以极大地提升数据查询效率,但是如何索引创建不当也会影响我们的查询效率,如果想使用好索引我们就要来关注一下索引的原理。本文主要讲的mysql索引,且…

Mysql索引基本原理

 

1.Mysql表空间、段、区、页

    在讲索引的概念之前我们先说一下mysql中段区页的概念。

    表空间是Mysql数据库存储的最高层,默认情况下InnoDB引擎只有一个表空间,所有的数据都是存放在这个表空间内。

    在表空间下数据是以段区页的形式进行存储的。一张Mysql表存储在数据库当中不是以行为单位存储数据读取的,mysql数据库读取的最小单位是页。

    段:一个段是由多个区构成的, 常见的段有数据段、索引段、回滚段等,在InnoDB存储引擎中,对段的管理都是由引擎自身所完成的。

    区:一个区是由多个连续的页组成的空间 ,无论页的大小怎么变动,一个区的默认大小是1M,默认情况下一个区包含64个连续的页,为保证区中的页是连续的 InnoDB会一次从磁盘中申请4~5个区。

    页:页也叫做块,默认情况下一个页大小为16K(可以通过 innodb_page_size 参数来设置一个页的大小), 常见的页类型有:数据页,索引页, undo页 ,系统页,事务数据页等。 每页存储最多的行记录也是有硬性规定的最多16KB/2-200,即7992行

Mysql索引基本原理[亲测有效]

    我们在数据库中查找数据其实是将磁盘中的数据加载到内存的一个过程。在这里,数据库不是将我们所需要查看的某一行或者某几行数据加载到内存当中,而是将我们需要查看的数据所在的页加载到内存当中。

 

2.数据库索引

    索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。

    常见的索引类型有:主键索引、唯一索引、普通索引、全文索引、组合索引。同时索引还分为聚簇索引和非聚簇索引,一张表只能有一个聚簇索引,其它的索引都是聚簇索引。

聚簇索引:一个表中只能有一个聚簇索引。一般情况下聚簇索引默认是主键 ,如果表中没有定义主键,InnoDB 会选择一个唯一的非空索引代替。如果没有这样的索引,InnoDB 会隐式定义一个主键来作为聚簇索引。而且聚簇索引对应的索引值在物理上是连续的。

聚簇索引:除了聚簇索引以外的索引是非聚簇索引。非聚簇索引是以聚簇索引为基础创建的。非聚簇索引记录的是聚簇索引的索引值,当我们通过一个普通索引去查找数据的时候其实普通索引会先去差对应数据的聚簇索引的索引值,然后再通过聚簇索引的索引值去查询对应的数据。

    这里说的是InnoDB引擎下的聚簇索引,对于MyISAM来说是没有聚簇索引的。使用MyISAM引擎的表的主键不是聚簇索引,MyISAM引擎的主键索引和其它索引一样可以直接找到对应数据的位置,其它索引不需要先找到主键索引,再通过主键索引去找对应数据。这个和两个引擎一个使用B树一个使用B+树来实现索引有关系。

3.索引的数据结构

    Mysql索引用到的数据结构主要为B树,但是也有用到hash,不同的引擎用到的数据结构不同。InnoDB引擎用到的是B+树索引, MyISAM引擎用到的是B树索引,还有 Memory引擎用到的HASH索引。

    由于HASH索引是利用HASH值来计算索引值,在等值查询的情况下对数据的查询效率比较高,但是再范围查询的时候的查询效率与B树索引相比就差很多了,所以我们使用当中更多的是用到的B+树索引。

 

多路查找树

    多路查找树的每一个节点可以存储多个元素且每个节点的孩子节点数可以有多个。和普通树相比,多路查找树的一个节点不再是只能存储一个元素 ,这打破了我们对树的理解,但是正是这个特性,使得它能够出色地解决IO问题(多路查找树的高度低于其它二叉树,高度越低查询数据需要进行的磁盘IO的次数相对就越少)。Mysql数据库中将一个节点的大小设置为Mysql数据库一页的大小,使每一个节点只需要一次IO就可以从磁盘加载到内存当中。

 

MyISAM引擎B树索引

     B-Tree 索引(或Balanced Tree),是一种很普遍的数据库索引结构。其特点是定位高效、利用率高、自我平衡,特别适用于高基数字段,定位单条或小范围数据非常高效。理论上,使用 B-Tree 在亿条数据与100条数据中定位记录的花销相同。 B-Tree 能加快数据的访问速度,因为存储引擎不再需要进行全表扫描来获取数据,数据分布在各个节点之中。

    MyISAM使用到了B-Tree索引,使用到了MyISAM引擎的表查询数据的时候使用的是那种索引,它都会去遍历对应的索引使用到的B-Tree,当遍历到对应索引值的时候就会在索引值对应的页上获取数据页的具体位置,然后将数据所在的页读取到内存当中。

Mysql索引基本原理[亲测有效]   

 

InnoDB引擎B+树索引

    B+Tree 是在 B-Tree 基础上的一种优化,使其更适合实现外存储索引结构,InnoDB 存储引擎就是用 B+Tree 实现其索引结构。通常在 B+Tree 上有两个头指针,一个指向根节点,另一个指向关键字最小的叶子节点,而且所有叶子节点(即数据节点)之间是一种链式环结构。因此可以对 B+Tree 进行两种查找运算:一种是对于主键的范围查找和分页查找,另一种是从根节点开始,进行随机查找。

    Mysql数据库中InnoDB引擎用到的数据结构就是B+Tree索引,因为InnoDB引擎有使用到聚簇索引,所以如果我们数据库表使用的是InnoDB引擎的情况下查询数据如果用到了索引有两种情况。一种情况是用到的索引为聚簇索引,这个时候只需要遍历聚簇索引所在的B+Tree便可以找到我们想要的数据位置。还有一种情况是到了非聚簇索引,这种情况下需要先遍历使用到的索引的B+Tree知道对应聚簇索引的索引值,然后再通过聚簇索引的索引值去遍历聚簇索引的B+Tree来找到我们想要的数据。

    由此可见,我们在查询当中使用聚簇索引的效率是远高于使用非聚簇索引的,因为使用聚簇索引的情况下可以避免回表,减少磁盘IO的次数。

Mysql索引基本原理[亲测有效]   

 

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/9639.html

(0)
上一篇 2023-02-04
下一篇 2023-02-04

相关推荐

  • mysql优化手段_MySQL索引优化

    mysql优化手段_MySQL索引优化
    Mysql数据库的优化技术 对mysql优化是一个综合性的技术,主要包括: a:表的设计合理化(符合3NF) b:添加适当索引(index)【四种:普通索引…

    2023-04-05
    165
  • mysql数据备份与还原_navicat忘记备份误删表

    mysql数据备份与还原_navicat忘记备份误删表关于删库跑路的事故现在已经屡见不鲜了,数据备份的必要性是企业数据管理极其重要的一项工作。关于数据备份、恢复也有很多场景及方法,本系列也会将主要的几种工具通过案例进行演示。 本系列将从逻辑备份及恢复开始

    2023-02-08
    157
  • Centos安装Cloudera Manager 6.3.0和CDH 6.3.2

    Centos安装Cloudera Manager 6.3.0和CDH 6.3.2前言 闲暇之时,羚羊给大家分享一下羚羊在Centos7 下安装Cloudera Manager 6.3.0和cloudera cdh 6.3.2的过程和安装过程中遇到的坑。至于为什么要选择C

    2023-03-17
    146
  • mysql 执行流程解析[通俗易懂]

    mysql 执行流程解析[通俗易懂]MySQL 可以分为 Server 层和存储引擎层两部分 Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核 心服务功能,以及所有的内置函数,所有跨存储引 …

    2023-01-25
    161
  • Python math.e:用Python实现自然常数e的计算

    Python math.e:用Python实现自然常数e的计算自然常数e是一个重要的无理数,它最早出现在数学中是由于对于函数f(x)=e^x来说,其导数与函数值相等,即f'(x)=f(x)。e的几个特点如下:

    2023-12-08
    121
  • MySQL命令(SQL语句)

    MySQL命令(SQL语句)1.mysql登陆 完整登陆命令: mysql -u root -p xxxxx -h 127.0.0.1 -P 23306 语法:mysql -u 用户名 -p 密码 -h mysql服务器的IP地

    2023-02-21
    137
  • 【12c】RMAN 与 DataGuard「终于解决」

    【12c】RMAN 与 DataGuard「终于解决」由于主库和备库的db_name相同的,只是db_unique_name不同,可以使用备库进行数据库的备份,从而减轻主库备份的负担。本篇演示DataGuard环境下RMAN工具的使用。 1 查看主库RM

    2023-03-05
    148
  • Python版本更新历程

    Python版本更新历程Python是一门常用的编程语言,拥有广泛的应用领域。Python最初由Guido van Rossum于1991年在荷兰创造。自从创造以来,Python已经发展成为一门成熟的编程语言。Python代码简洁,易于理解,被广泛用于开发多种应用。

    2024-07-05
    55

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注