| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> MySQL索引详解 -> 正文阅读 |
|
[数据结构与算法]MySQL索引详解 |
索引简介
索引的作用就相当于目录的作用。目录已经按一定的规则把字排好序了,在目录上查找相当于先找到字的内存地址,然后通过内存地址直接能快速的找到那个字,不需要一页一页找。 优缺点
大多数情况下,索引查询都是比全表扫描要快的。但是如果数据库的数据量不大,那么使用索引的提升并不大,而且耗费空间。
底层数据结构前言B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引。B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的。在讲B+树之前必须先了解二叉查找树、平衡二叉树(AVLTree)和平衡多路查找树(B-Tree),B+树即由这些树逐步优化而来。 二叉查找树具有以下性质:
二叉查找树可以任意地构造,同样是2,3,5,6,7,8这六个数字,也可以按照下图的方式来构造: 但是这棵二叉树的查询效率就低了。因此若想二叉树的查询效率尽可能高,需要这棵二叉树是平衡的,从而引出新的定义——平衡二叉树,或称AVL树 平衡二叉树平衡二叉树(AVL Tree):
下面的两张图片,左边是AVL树,它的任何节点的两个子树的高度差<=1;右边的不是AVL树,其根节点的左子树高度为3,而右子树高度为1; 如果在AVL树中进行插入或删除节点,可能导致AVL树失去平衡,这种失去平衡的二叉树可以概括为四种姿态:LL(左左)、RR(右右)、LR(左右)、RL(右左)。它们的示意图如下: 这四种失去平衡的姿态都有各自的定义:
==AVL树失去平衡之后,可以通过旋转使其恢复平衡。==下面分别介绍四种失去平衡的情况下对应的旋转方法。 LL的旋转。LL失去平衡的情况下,可以通过一次旋转让AVL树恢复平衡。步骤如下:
LL旋转示意图如下: RR的旋转:RR失去平衡的情况下,旋转方法与LL旋转对称,步骤如下:
RR旋转示意图如下: LR的旋转:LR失去平衡的情况下,需要进行两次旋转,步骤如下:
LR的旋转示意图如下: RL的旋转:RL失去平衡的情况下也需要进行两次旋转,旋转方法与LR旋转对称,步骤如下:
RL的旋转示意图如下: B-Tree平衡多路查找树(B-Tree)是为**磁盘等外存储设备设计**的一种平衡查找树。
在MySQL中可通过如下命令查看页的大小:
但是系统一个磁盘块的存储空间往往没有这么大(16KB),但是**InnoDB在把磁盘数据读入到内存时会以页为基本单位** 所以InnoDB每次申请磁盘空间时都会是若干地址连续磁盘块来达到页的大小16KB 在查询数据时如果一个页中的每条数据都能有助于定位数据记录的位置,这将会减少磁盘I/O次数,提高查询效率。(应该是索引)
B-Tree结构的数据可以让系统高效的找到数据所在的磁盘块。为了描述B-Tree,首先定义一条记录为一个二元组[key, data] ,key为记录的键值,对应表中的主键的值,data为一行记录中除主键外的数据。对于不同的记录,key值互不相同。 一棵m阶的B-Tree有如下特性: (二叉树的阶数是一个节点的子节点数目的最大值。)
B-Tree中的每个节点根据实际情况可以包含大量的关键字信息和分支,如下图所示为一个3阶的B-Tree:
模拟查找关键字29的过程: 根据根节点找到磁盘块1,读入内存。【磁盘I/O操作第1次】 结论
B+TreeB+Tree是在B-Tree基础上的一种优化,使其更适合实现外存储索引结构,InnoDB存储引擎就是用B+Tree实现其索引结构
在B+Tree中
B+TREE 第二级的 数据并不能直接取出来,只作索引使用。在内存有限的情况下,查询效率高于 B-TREE 将上一节中的B-Tree优化,由于B+Tree的非叶子节点只存储键值信息,假设每个磁盘块能存储4个键值及指针信息,则变成B+Tree后其结构如下图所示: 通常在B+Tree上有两个头指针,一个指向根节点,另一个指向关键字最小的叶子节点,而且所有叶子节点(即数据节点)之间是一种链式环结构。因此可以对B+Tree进行两种查找运算:一种是对于主键的范围查找和分页查找,另一种是从根节点开始,进行随机查找。
InnoDB存储引擎中页的大小为16KB,一般表的主键类型为INT(占用4个字节)或BIGINT(占用8个字节),指针类型也一般为4或8个字节,也就是说一个页(B+Tree中的一个节点)中大概存储16KB/(8B+8B)=1K个键值(因为是估值,为方便计算,这里的K取值为〖10〗^3)。也就是说一个深度为3的B+Tree索引可以维护10亿 条记录。 实际情况中每个节点可能不能填充满,因此在数据库中,B+Tree的高度一般都在2-4层。mysql的InnoDB存储引擎在设计时是将根节点常驻内存的,也就是说查找某一键值的行记录时最多只需要1-3次磁盘I/O操作。(IO操作,从磁盘读数据到内存里)
区别B-Tree每个节点中不仅包含数据的key值,还有data值。而**每一个页的存储空间是有限**的,如果data数据较大时将会导致每个节点(即一个页)能存储的key的数量很小,当存储的数据量很大时同样会导致B-Tree的深度较大,只能纵向发展,增大查询时的磁盘I/O次数,进而影响查询效率。
B 树& B+树B 树也称 B-树,全称为 多路平衡查找树 ,B+ 树是 B 树的一种变体。B 树和 B+树中的 B 是 目前大部分数据库系统及文件系统都采用 B-Tree 或其变种 B+Tree 作为索引结构。 B 树& B+树两者有何异同呢?
分类存储结构划分从存储结构上来划分:
这里所描述的是索引存储时保存的形式 主键索引英文:Primary Key
二级索引二级索引又称为辅助索引,是因为二级索引的叶子节点存储的数据是主键。也就是说,通过二级索引,可以定位主键的位置。 唯一索引英文:Unique Key 目的大部分时候都是为了该属性列的数据的唯一性,而不是为了查询效率。
普通索引英文:Index 唯一作用就是为了快速查询数据,并允许数据重复和 NULL。
前缀索引英文:Prefix 前缀索引是对文本的前几个字符创建索引
全文索引英文:Full Text 主要是为了检索大文本数据中的关键字的信息
聚簇索引简介
创建聚簇索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的就是整张表的行记录数据,这个特性决定了索引组织表中数据也是索引的一部分,每张表只能拥有一个聚簇索引
大部分情况下,我们建表的时候都会创建主键,因此大部分都是根据主键聚簇的 当我们根据主键字段来进行查询时,效率是最高的,不需要二次查找,直接主键字段查询索引树,叶子节点就是存储的数据了 Innodb通过主键聚集数据,如果没有定义主键,innodb会选择非空的唯一索引代替。如果没有这样的索引,innodb会隐式的定义一个主键来作为聚簇索引。 优点:
缺点:
非聚集索引简介
优点更新代价比聚集索引要小 。非聚集索引的更新代价就没有聚集索引那么大了,非聚集索引的叶子节点是不存放数据的 缺点
这是 MySQL 的表的文件截图:
覆盖索引
如果一个索引包含(或者说覆盖)所有需要查询的字段的值,我们就称之为“覆盖索引”。我们知道在 覆盖索引即需要查询的字段正好是索引的字段,那么直接根据该索引,就可以查到数据了, 而无需回表查询。
覆盖索引: |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 15:36:50- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |