MySQL索引底层原理理解以及常见问题总结

目录

    • 二叉查找树为索引
    • 红黑树为索引
    • B树作为索引
    • B+树作为索引
    • MyISAM存储引擎索引实现
    • InnoDB存储引擎索引实现
    • 常见问题
      • 聚集索引与非聚集索引
      • InnoDB基于主键索引和普通索引的查询有什么区别?
      • InnoDB主键索引为何是整型的自增主键
      • 何时使用业务字段作为主键呢?
      • 哈希与B树
    • “N叉树”的N值在MySQL中是可以被人工调整的么?

二叉查找树为索引

二叉树的key为col2,value为索引所在行的磁盘地址。
但如果拿col1来作为key的话,会发现二叉搜索树退化成链表。
在这里插入图片描述

红黑树为索引

仍然以col1作为索引key,发现找6只需要查找3次。比二叉查找树更加合适一点
在这里插入图片描述
当表中有1百万行数据时,这棵树的高度会越来越大。如果我们查找的元素在叶子节点,查找次数会非常多。

B树作为索引

可以在树的横向上做文章,每个节点原本只存储一行数据的地址,现在可以修改为存储多行数据。因为树的高度越多说明IO操作越多,导致与磁盘的交互越多。
B树:
叶节点具有相同的深度,叶节点的指针为空。
所有的索引元素不重复
节点中数据索引从左到右递增排列
在这里插入图片描述

B+树作为索引

B+树
非叶子节点不存储data,只存储索引,这样可以放更多索引
叶子节点包含所有索引字段。
叶子节点用指针连接,提高区间访问性能。

也就是说在叶子节点存储了完整的元素,然后把一些处于中间位置的索引元素提取出来,作为非叶子节点。
MySQL设置默认节点大小为16kb,一个bigint为8byte,一个指针为6byte。所以一个节点最多能存16kb/14b = 1170。
再假设叶子节点一个元素占空间大小为1kb。
如果全部节点存储了满了,h = 3的时候一共能够存储1170 * 1170 * 16 = 21902400;这样可以存两千多万个数据了。
在这里插入图片描述
以下面为例:
注意,整个树都放在磁盘中,每次load一个节点进入内存。一般来说,先从根节点开始load。
我们现在要找6。比对根节点的3,6大于3,向右比较,发现6大于5,于是从5右边的指针找到下面一层的节点.
然后把这一层的节点从磁盘里面load到内存中。
我们还可以看到最底层的节点之间会有链表相连。
在这里插入图片描述

MyISAM存储引擎索引实现

注意,存储引擎是用来形容数据库中的表的。
MyISAM索引文件数据文件是分离的。
我们使用查询语句:

select * from ...  where Col1 = 49;

首先查找是否是索引字段,如果是就从MYI文件中的B+树里面去定位到这个元素。key存储的是索引元素,data存储的是索引元素所在的那一行的磁盘地址指针。拿到指针后去MYD文件定位。
在这里插入图片描述

InnoDB存储引擎索引实现

索引和数据放到了同一个文件中:.ibd文件。
叶节点包含了完整的数据记录,而不只是一个地址指针。
在这里插入图片描述

常见问题

聚集索引与非聚集索引

InnoDB就是聚集索引,索引和数据文件合在一起。
MyISAM是非聚集索引,索引和数据文件分离。
非聚集索引要查找两次,一次找到指针地址,一次根据指针地址找具体数据。
聚集索引只需要查找一次,直接找到具体数据,所以效率要更高。

InnoDB基于主键索引和普通索引的查询有什么区别?

如果语句是 select * from T where ID=500,即主键查询方式,则只需要搜索 ID 这棵 B+ 树;
如果语句是 select * from T where k=5,即普通索引查询方式,则需要先搜索 k 索引树,得到 ID 的值为 500,再到 ID 索引树搜索一次。这个过程称为回表。
也就是说,基于非主键索引的查询需要多扫描一棵索引树。因此,我们在应用中应该尽量使用主键查询。
在这里插入图片描述

InnoDB主键索引为何是整型的自增主键

自增主键的使用,关于存储性能
InnoDB必须要有主键,而且推荐使用的是整型的自增主键。
因为数字好建立索引,方便比较,而且相比较于字符串类型,占用的空间更小
关于自增:由于底层叶子节点是递增排列的,如果此时主键是递增的,那么新插入的元素就显然在叶子节点的最右边。
如果主键不是递增的,插入一个新的元素可能就会在叶子节点链表中间某处。B+树的结构调整就十分巨大了,可能上层的非叶子节点的索引值要修改。
例如这里我们插入8
在这里插入图片描述
树的结构发生了很大变化,直接裂开。
在这里插入图片描述
自增主键的插入数据模式,每次插入一条新记录,都是追加操作,都不涉及到挪动其他记录,也不会触发叶子节点的分裂。

何时使用业务字段作为主键呢?

只有唯一的索引,而且该索引为唯一索引。由于没有其他索引,所以也就不用考虑其他索引的叶子节点大小的问题。
直接将这个索引设置为主键,可以避免每次查询需要搜索两棵树。

哈希与B树

哈希查找某个key很快,但是不支持范围查找。
B树用到范围查找就很方便了。叶子节点从左到右是一个递增的趋势。并且叶子节点之间通过指针相连,所以不需要再返回到上层索引中寻找。如果我们要找大于20的元素,那么只要在最底层,20元素的右边进行遍历即可。
在这里插入图片描述
如果是小于某个元素的情况,就是从底层叶子节点的左边开始,一直包含到边界即可。

“N叉树”的N值在MySQL中是可以被人工调整的么?

1, 通过改变key值来调整
N叉树中非叶子节点存放的是索引信息,索引包含Key和Point指针。Point指针固定为6个字节,假如Key为10个字节,那么单个索引就是16个字节。如果B+树中页大小为16K,那么一个页就可以存储1024个索引,此时N就等于1024。我们通过改变Key的大小,就可以改变N的值
2, 改变页的大小
页越大,一页存放的索引就越多,N就越大。

数据页调整后,如果数据页太小层数会太深,数据页太大,加载到内存的时间和单个数据页查询时间会提高,需要达到平衡才行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377263.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

des算法密码多长_密码学中的多个DES

des算法密码多长This is a DES that was susceptible to attacks due to tremendous advances in computer hardware in cryptography. Hence, it was a very complex or competent algorithm it would be feasible to reuse DES rather than writing an of cryptography. 由于…

《MySQL——索引笔记》

目录回表覆盖索引最左前缀原则联合索引的时候,如何安排索引内的字段顺序?索引下推重建索引问题联合主键索引和 InnoDB 索引组织表问题in与between的区别回表 回到主键索引树搜索的过程,我们称为回表。 覆盖索引 覆盖索引就是在这次的查询中…

《操作系统知识点整理》

目录进程与线程比较多线程同步与互斥生产者与消费者哲学家就餐问题读者写者问题进程间通信管道消息队列共享内存信号量信号Socket锁互斥锁与自旋锁读写锁乐观锁与悲观锁死锁进程与线程比较 进程是资源(包括内存、打开的文件等)分配的单位,线…

操作系统大内核和微内核_操作系统中的内核

操作系统大内核和微内核A Kernel is the central component of an Operating System. The Kernel is also said to be the heart of the Operating System. It is responsible for managing all the processes, memory, files, etc. The Kernel functions at the lowest level …

《MySQL——锁》

全局锁是什么?全局锁有什么用?全局锁怎么用? 全局锁主要用在逻辑备份过程中,对于InnoDB 引擎的库,使用–single-transaction; MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTW…

搜索引擎Constellio及Google Search Appliances connectors

做搜索产品的时候发现国外一个同类型的产品contellio,发现功能比较强大,先记录下来 貌似可以添加文档 网站 以及数据库等不同类型的数据源 http://wiki.constellio.com/index.php/Main_Page http://www.constellio.com/ http://www.constellio.com htt…

分类器是如何做检测的?——CascadeClassifier中的detectMultiScale函数解读

原地址:http://blog.csdn.net/delltdk/article/details/9186875 在进入detectMultiScal函数之前,首先需要对CascadeClassifier做初始化。 1. 初始化——read函数 CascadeClassifier的初始化很简单: cv::CascadeClassifier classifier; cl…

abs std::abs_ABS的完整形式是什么?

abs std::absABS:防抱死制动系统 (ABS: Anti-lock Braking System) ABS is an abbreviation of the Anti-lock Braking System. It is a safety anti-skid braking system that is used on a variety of aircraft, automobiles and other land vehicles, such as mo…

汉字速查使用方法简介

《汉字速查》(HanziSearcher)是一个支持全汉字字典和词典的检索工具。其界面如下所示。 界面上方为工具栏。 左方为字典和词典检索栏。 右方在启动时显示版权信息和作者的联系方式,在执行检索时,显示检索结果。 检索方法 汉字速查…

android jni示例_Android服务示例

android jni示例A service is a component that runs in the background for supporting different types of operations that are long running. The user is not interacted with these. These perform task even if application is destroyed. Examples include handling of…

空间换时间,把递归的时间复杂度降低到O(2n)

递归算法的时间复杂度除非只有前两项,否则都不是线性的,并且相当耗费内存。我们用最常见的的fibonacci数列来说明: function fibonacci(n){if( n 0 || n 1){return n;} else {return fibonacci(n - 1) fibonacci(n - 2);} } 这是一种最常见…

《MySQL——给长字符串加索引》

对于长字符串,可用如下方式建立索引: (1)前缀索引 (2)字符串倒叙前缀索引 (3)添加hash字段并在hash字段上加索引 (4)字段拆分(一个字段可拆分为两…

傻瓜教你看清MVC内部执行流程之ViewData数据传输,轻松学MVC--①目了然篇(待续)

1.首先在执行到Controller里面的action(方法)时,执行到最后会调用一个View()-->此方法是Controller的一个方法 源代码: View Code protected internal ViewResult View(){return View(null /* viewName */, null /* masterName */, null /* model */);} 2.然后继续调用自己…

poj 1088

题目:http://poj.org/problem?id1088 记忆化搜索,dp[r][c] max(dp[r - 1][c] , dp[r 1][c] , dp[r][c - 1] , dp[r][c 1]) 1 ( if (题目给的条件满足)) View Code 1 using namespace std;2 typedef long long ll;3 const in…

《MySQL——order by逻辑(全字段排序与rowid排序)》

创建一个表,然后使用查询语句: 查询城市是“杭州”的所有人名字,并且按照姓名排序返回前 1000 个人的姓名、年龄 create table t (id int(11) not null,city vachar(16) not null,name vachar(16) not null,age vachar(16) not null,addr va…

HTML5 video

摘要:本文主要介绍HTML5 video在android2.2中实现的主要架构和程序流程。 一、实现HTML5 video主要的类 1. 主要类结构及介绍 图1中绿色类为java类,其余为c类,下面是各个类的具体介绍: (1) HTMLElement类不是最上层类&#xff0c…

明源面试

明源面试,笔试题目如下 一、SQL测试题 1 有两张表 根据给出的SQL语句,写出返回的行数分别是多少?为了形象直观的显示,我给出了sql语句执行结果。 A 学生表 B分数表 新题目 select a.* from a inner join b on a.idb.id; …

肯德基收银系统模式_肯德基的完整形式是什么?

肯德基收银系统模式肯德基:肯塔基炸鸡 (KFC: Kentucky Fried Chicken) KFC is an abbreviation of "Kentucky Fried Chicken". It is a fast-food restaurant chain whose specialty is known for fried chicken because of its specialization in it. It…

泛型(CSDN转载)

函数的参数不同叫多态,函数的参数类型可以不确定吗? 函数的返回值只能是一个吗?函数的返回值可以不确定吗? 泛型是一种特殊的类型,它把指定类型的工作推迟到客户端代码声明并实例化类或方法的时候进行。 下面是两个经典…

pvr波形是什么意思_PVR的完整形式是什么?

pvr波形是什么意思PVR:Priya村路演 (PVR: Priya Village Roadshow) PVR is an abbreviation of Priya Village Roadshow. It is one of the biggest and leading multiplex cinema chains in India. PVR是Priya Village Roadshow的缩写 。 它是印度最大和领先的多元…