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,一经查实,立即删除!

相关文章

Spring之HibernateTemplate 和HibernateDaoSupport

spring提供访问数据库的有三种方式: HibernateDaoSupport HibernateTemplate(推荐使用) jdbcTemplate(我们一般不用) 类所在包: HibernateTemplate:org.springframework.orm.hibernate3.HibernateTemplate …

JDOJ-重建二叉树

这是一道面试题,可以说是数据结构中的基础题了,由先序遍历以及中序遍历生成一棵树,然后输出后序遍历。 一个递归函数传递5个参数,顶点编号,先序左右区间,中序左右区间,每次进行区间长度判定&…

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的区别回表 回到主键索引树搜索的过程,我们称为回表。 覆盖索引 覆盖索引就是在这次的查询中…

计算凸多边形面积的算法

1. 思路: 可以将凸多边形(边数n > 3)划分为 (n - 2) 个三角形,分别运用向量叉积计算每个三角形的面积,最后累加各个三角形的面积就是多边形的面积。 2. 求多边形面积的算法模板:   定义点的结构体 str…

Windows CE开发常见问题解答

转自: http://blog.csdn.net/slyzhang/article/details/6110490 1.怎样在一个控件获得焦点时打开软键盘?比如一个EditBox获得焦点后,这个时候自动打开软键盘,这样可以方便用户输入——SIPINFO、SHSIPINFO、SIPSETINFO、SIPGETINFO…

Julia中的supertype()函数

Julia| supertype()函数 (Julia | supertype() function) supertype() function is a library function in Julia programming language, it is used to get the concrete supertype of the given type (data type). supertype()函数是Julia编程语言中的库函数,用于…

《操作系统知识点整理》

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

for,foreach,iterator的用法和区别

相同点&#xff1a; 三个都可以用来遍历数组和集合不同点&#xff1a;1.形式差别 for的形式是 for&#xff08;int i0;i<arr.size();i&#xff09;{...} foreach的形式是 for&#xff08;int i&…

和菜鸟一起学linux总线驱动之初识spi驱动主要结构

既然知道了协议了&#xff0c;那么就可以开始去瞧瞧linux kenerl中的spi的驱动代码了&#xff0c;代码中有很多的结构体&#xff0c;还是对主要的结构体先做个了解吧&#xff0c;那样才可以很好的理解驱动。主要是include/linux/spi.h 首先是SPI的主机和从机通信接口&#xff0…

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

操作系统大内核和微内核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——锁》

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

搜索引擎Constellio及Google Search Appliances connectors

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

dig下载_DIG的完整形式是什么?

dig下载DIG&#xff1a;副监察长 (DIG: Deputy Inspector General) DIG is an abbreviation of the Deputy Inspector General. It is a high-level position in the Indian Police Service. The officers who already offered service on Senior Superintendent of Police (SS…

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

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

<MySQL>何时使用普通索引,何时使用唯一索引

如果能够保证业务代码不会写入重复数据&#xff0c;就可以继续往下看。 如果业务不能保证&#xff0c;那么必须创建唯一索引。 关于查询能力 普通索引和唯一索引在查询能力上是没有很大差别的。 如&#xff1a;select id from T where k5 1、普通索引查找到满足条件的第一个记…

Web版OutLook,利用POP接收邮件服务器邮件

一直想做一个Web版的OutLook&#xff0c;所以才萌生这个想法&#xff0c;其实以前也接触过这方面的东西。于是上网找了找&#xff0c;漫天的都是Jmail来接收&#xff0c;好吧&#xff0c;既然大家都在用我也就下载下来试试了。 什么&#xff0c;怎么总是报错呢&#xff1f;原来…

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

abs std::absABS&#xff1a;防抱死制动系统 (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…

ubuntu 使用

shell 命令历史搜索 &#xff1a; ctrl r使能 session 选择界面&#xff1a;安装gnome-session-fallback安装lwqq转载于:https://www.cnblogs.com/JonnyLulu/p/3600263.html

汉字速查使用方法简介

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