精华内容
下载资源
问答
  • 微信公众号:Java患者专注Java领域技术分享MySQL索引底层原理局部性与页在操作系统中,我们执行一个指令去磁盘取数据,那么他会从磁盘取出4KB数据,这个4KB就是一个局部单位,而这4KB数据就是你的指令中取出的数据周围的...

    微信公众号:Java患者
    专注Java领域技术分享

    MySQL索引底层原理

    局部性与页

    在操作系统中,我们执行一个指令去磁盘取数据,那么他会从磁盘取出4KB数据,这个4KB就是一个局部单位,而这4KB数据就是你的指令中取出的数据周围的数据,因为操作系统认为你下一次的数据会从这条数据的周围中取。每次从磁盘读取数据在这里称为一次磁盘IO。那么在Mysql的操作当中,也有这么一个原理。

    ebdf454227216a8bced0bfdd51449c15.png

    数据结构

    现在我们有以上数据,当我们执行一句查询语句

    select * from t_user where a = 3;

    如果mysql没有局部性的概念的时候,那么这条sql会产生三次IO磁盘操作,则mysql会从磁盘取出第一条数据到内存中,然后比对a字段的值,一直比对到第三条才是正确的,那么会产生3次IO磁盘操作,有了局部性后,那么mysql会从磁盘中进行局部性的取出一页数据,这里一页数据是16KB,一次取出来后放到内存中,进行比对,那么就提高了执行效率。

    89234abf1c4c11ab85b75ff4efd7a3a9.png

    页大小
    show global status like 'Innodb_page_size';

    通过上面的sql我们知道此时使用的Innodb存储引擎所对应的页大小是16384  也就是16384/1024 = 16KB。

    页数据原理

    dc318b71b72b9f6ee2372a92baf62295.png

    当我们使用insert插入上面的语句的时候,其实可以看到插入的过程中,这4条数据已经按主键的顺序插入到MySQL中,那么在这个插入的过程是怎么样的,我们来研究一下InnoDB存储的过程。

    首先插入第一条数据

    e090a796c25d8de6dd82e8672554d860.png

    接着我们插入第二条数据的时候,第二条数据的主键会跟第一条数据的主键比较大小,然后再插入。

    7ba6d4d6efa0e54e44c9ce4f791b4021.png

    最后插入的数据就会根据主键的大小来排序了

    8ab008e50ba0273ffd939e679be7e62f.png

    插入的数据就形成了我们页数据中的一部分--用户数据区域,并且每一条数据都有一个指针指向了下一条记录,这也形成了一个链表的形式,现在比如说我们要找a=3的数据,那么我们就得从第一条比对到第三条数据,然后取出,那如果有10000条数据呢?需要比对10000次。因为这是一个链表的数据结构,我们都知道链表的数据结构是增删快,查找慢,那么MySQL的InnoDB的存储引擎是怎么解决的呢,在这里引入了一个页目录

    页目录在这里重新为主键排了一次序,比如一组的数据是2条,那么主键为1跟主键为2就为一组

    e4deec24f360235f7338b1a1d4c19d1b.png

    如图,如果当我们要查找a=4的这一条数据,那么就从页目录中找,就可以立即找到该条数据会在第二组,然后在第二组中比对到了a=4之后,取出数据。这就是一页数据,那么当数据足够多,多到一页已经放不下了,自然就会有第二页。这里就引出一个页的指针。

    7faf0b1ea3bd0c1ca896d36dc5c8ed1b.png

    接下来的页就会变成上面的数据结构,假设我们现在要找a=6的数据,那么就会基于第一页去找,发现第一页没有,那就基于第一页到第二页去找,发现在页目录5中,那么a=6就在页目录为5的组中取出数据,假如当页数达到了10000页呢,我们要找a=20000的数据,那就得一页一页的去比如页目录中的值,数据太多也很麻烦,现在就会有一个目录页的数据结构出来,也是同样的思路。

    ca04033dede29fcb8400b4c4fe3656ab.png

    当我们要查找a=6的数据,在目录页中可以定位到在第100页的地址,那么我们就可以直接在第100页中去查找我们的数据。

    最后渐渐的,就变成了一个B+树的数据结构。

    展开全文
  • 微信公众号:Java患者专注Java领域技术分享MySQL索引底层原理局部性与页在操作系统中,我们执行一个指令去磁盘取数据,那么他会从磁盘取出4KB数据,这个4KB就是一个局部单位,而这...

    微信公众号:Java患者
    专注Java领域技术分享

    MySQL索引底层原理

    局部性与页

    在操作系统中,我们执行一个指令去磁盘取数据,那么他会从磁盘取出4KB数据,这个4KB就是一个局部单位,而这4KB数据就是你的指令中取出的数据周围的数据,因为操作系统认为你下一次的数据会从这条数据的周围中取。每次从磁盘读取数据在这里称为一次磁盘IO。那么在Mysql的操作当中,也有这么一个原理。

    数据结构

    现在我们有以上数据,当我们执行一句查询语句

    select * from t_user where a = 3;
    

    如果mysql没有局部性的概念的时候,那么这条sql会产生三次IO磁盘操作,则mysql会从磁盘取出第一条数据到内存中,然后比对a字段的值,一直比对到第三条才是正确的,那么会产生3次IO磁盘操作,有了局部性后,那么mysql会从磁盘中进行局部性的取出一页数据,这里一页数据是16KB,一次取出来后放到内存中,进行比对,那么就提高了执行效率。

    页大小
    show global status like 'Innodb_page_size';
    

    通过上面的sql我们知道此时使用的Innodb存储引擎所对应的页大小是16384  也就是16384/1024 = 16KB。

    页数据原理


    当我们使用insert插入上面的语句的时候,其实可以看到插入的过程中,这4条数据已经按主键的顺序插入到MySQL中,那么在这个插入的过程是怎么样的,我们来研究一下InnoDB存储的过程。

    首先插入第一条数据


    接着我们插入第二条数据的时候,第二条数据的主键会跟第一条数据的主键比较大小,然后再插入。


    最后插入的数据就会根据主键的大小来排序了

    插入的数据就形成了我们页数据中的一部分--用户数据区域,并且每一条数据都有一个指针指向了下一条记录,这也形成了一个链表的形式,现在比如说我们要找a=3的数据,那么我们就得从第一条比对到第三条数据,然后取出,那如果有10000条数据呢?需要比对10000次。因为这是一个链表的数据结构,我们都知道链表的数据结构是增删快,查找慢,那么MySQL的InnoDB的存储引擎是怎么解决的呢,在这里引入了一个页目录

    页目录在这里重新为主键排了一次序,比如一组的数据是2条,那么主键为1跟主键为2就为一组


    如图,如果当我们要查找a=4的这一条数据,那么就从页目录中找,就可以立即找到该条数据会在第二组,然后在第二组中比对到了a=4之后,取出数据。这就是一页数据,那么当数据足够多,多到一页已经放不下了,自然就会有第二页。这里就引出一个页的指针。

    接下来的页就会变成上面的数据结构,假设我们现在要找a=6的数据,那么就会基于第一页去找,发现第一页没有,那就基于第一页到第二页去找,发现在页目录5中,那么a=6就在页目录为5的组中取出数据,假如当页数达到了10000页呢,我们要找a=20000的数据,那就得一页一页的去比如页目录中的值,数据太多也很麻烦,现在就会有一个目录页的数据结构出来,也是同样的思路。

    当我们要查找a=6的数据,在目录页中可以定位到在第100页的地址,那么我们就可以直接在第100页中去查找我们的数据。

    最后渐渐的,就变成了一个B+树的数据结构。

    展开全文
  • mysql索引底层原理分析

    mysql索引底层原理分析

    展开全文
  • 深入理解 MySQL 索引底层原理 Mysql 作为互联网中非常热门的数据库,其底层的存储引擎和数据检索引擎的设计非常重要,尤其是 Mysql 数据的存储形式以及索引的设计,决定了 Mysql 整体的数据检索性能。 何为索引 我们...
  • 在腾讯课堂上了一节mysql索引底层原理的课,感觉很不错,所以在此分享一波。数据库中最常见的慢查询的优化方式是什么?答:加索引为什么加索引能优化慢查询?答:因为索引其实就是一种优化查询的数据结构。比如mysql...

    参考:腾讯课堂

    如有侵权,请联系本人立即删除。

    在腾讯课堂上了一节mysql索引底层原理的课,感觉很不错,所以在此分享一波。

    数据库中最常见的慢查询的优化方式是什么?

    答:加索引

    为什么加索引能优化慢查询?

    答:因为索引其实就是一种优化查询的数据结构。比如mysql的索引就是使用B+树来实现的,而B+树就是一种数据结构,可以优化查询速度。所以可以利用索引来优化慢查询。

    索引定义:优化查询的数据结构。

    我们知道,可以用来优化查询的数据结构有哈希表,完全平衡二叉树,B树,B+树。那么为什么我们使用最多的是B+树呢?

    首先,我们先来看哈希表。

    哈希表的存储是这样的:比如你要存储“小红”这个字符串,则要先获得hashcode,然后再计算要放入的数组下标,然后再放入。此时可能会产生哈希碰撞问题,所以常创建链表解决(即拉链法)。

    这里推荐一个数据结构可视化的网站,可能需要出国外访问。

    Open Hash Tables (Closed Addressing)

    这里就可以模拟哈希表的插入过程,然后大家就可以理解哈希索引了。

    2adc4592eb20d0ede80e018dea4c802c.png

    上面是我的一个使用截屏,由于我之前写过很多关于hashmap的文章了,了解比较深,所以就不细讲了。

    就比如对名字建立哈希索引,然后select * from student where name="小红"。那么mysql就会根据“小红”这个字符串先找到数组下标,然后定位到具体的节点,然后从节点中取出“小红”这一行记录所在的地址,然后再去地址中找到这行的记录。(这是myisam的非聚族索引的情况,叶子节点存放的记录的地址)

    然后来看哈希索引的优点和缺点:

    优点:就如上述描述的这样,直接进行计算下标,直接查询单一数据非常快。

    缺点:如果是进行select * from student where age>18;这样的范围查询的话,哈希索引就必须全表遍历,获得age数据,然后再依次进行比较,也就是相当于没有索引了。这样就不能优化查询效率了。

    然后再来看完全平衡二叉树:

    前面在以前的文章中队红黑树和平衡二叉树做过深入的了解,这里就不细讲他的结构了。

    这里就直接上图理解:

    AVL Trees (Balanced binary search trees)

    7b35517bad0027604ece465e847dec39.png

    很明显,二叉树这个定义的本身就限制了它,即一个节点只能有两个子节点。所以当插入的数据非常多时,树的深度就会非常高。树的深度非常高的话就会影响查询效率。所以没有使用二叉树来当索引的。但是,它支持范围查询,因为二叉树是有序的。而且也可以提高查询效率,还是因为它是有序的,而且高度相比其它二叉树更平衡,通过二分法查询即可。但是,由于存储大量数据时高度太高,会影响效率。(后面进行详细解释)

    然后再来看B树:

    B Trees

    8ccc5096afc0641ead15f31d1717f174.png

    不知道大家对B树的理解怎么样,可以自己在网址里输入一波,我简单介绍一下就是可以一个节点可以存储多个节点的搜索树。这样就没有了二叉树的两个节点的限制,同时带有有序的特点。所以图中有个参数:MAX.Degree,即一个节点存储的最大节点数,这里设置的是3,看得比较明显。这样的话一层就可以存储很多的数据了。

    这样看B树,它有二分查找可以快速定位数据的所在位置,而且每层可以存放大量数据,所以树的高度低。感觉还是很不错的。但是,它在进行mysql的范围查询时也显示出缺陷,B树不支持范围查询(或者说范围查询效率太低,因为比一个数据大的话,虽说肯定会在右子树,但是上层数据和其它子树的数据不好对比,理解B树的结构就很好理解)

    然后,再来看我们的最终大boss,B+树

    B+ Trees

    58407504eede1349a43cc0fb1b989a3f.png

    我们对比一下B+树和B树,发现了什么?图中是有重复元素的,仔细一看,所有的非叶子节点都在叶子节点中出现了备份。也就是说,最下面的一层,也就是所有的叶子节点就包含了所有的数据。这就和前面的所有结构都不一样的地方了。然后,比起B树而言,叶子节点这层还有指向后面的指针,也就是多了指向。这就能很好地进行了范围查询,很好地解决了B树的问题。这样定位到数据后,直接在这层的指针遍历即可。

    这就是我们最经常使用的B+树。

    我们来分析一下索引遍历的过程,先通过类似的二分原理快速地定位数据,然后取出节点中的对应的记录地址,然后再到地址中取出对应的记录。perfect!

    经过上述的讨论,我总结了一下,衡量一种mysql索引好不好有三个原则:

    1.能不能快速定位到元素所在位置

    2.能不能较好的进行范围查询

    3.树的高度是低还是高

    然后,我们在来看看为啥树的高度越高,查询效率越低呢?

    首先,我们要了解到索引数据其实相对来说还是是很大的。在实际项目场景中,存储的可能是上亿的数据,即使只是其中的部分,索引还是非常大,我们是不可能把那么多的数据全部同时放入内存当中的。所以,这些索引也是存放在磁盘当中的。所以我们可以思考,哪种数据结构更适合从磁盘读取数据?或者说,哪种数据结构更能提高磁盘的io效率?

    如图:这是B+树的

    4e2723e1fca7ddaf3fe6f2d3fbe09aad.png

    先来模拟一次B+树的读取过程:

    比如要找艾克:

    1.先从磁盘中取出海兽祭司到内存(第一次磁盘io读取),发现不是,而且艾克对应的key大于海兽祭司的,知道要找右子树。

    2.从右子树中取出盖伦(第二次磁盘io读取),发现不是,发现艾克的key大于盖伦的,所以继续找右子树。

    3.找到了艾克。

    所以里进行了两次的磁盘io。

    然后在完全平衡二叉树中在存放,假设艾克还是在最底层,同理,可发现要进行3次磁盘io。所以,也就是树的高度决定了磁盘io的次数,也就是直接影响了查询效率。

    上面的例子限制了B+树的节点数,所以看起来不是很明显,当大量数据进行存储时,则会产生巨大的变化。你走了100公里找到了水,别人走了 1 公里就找到了水,你是不是得像别人学习一下啊?

    所以,到这里,我们可以总结出:mysql选用B+树这种数据结构作为索引,可以提高查询索引时的磁盘io效率,并且可以提高范围查询的效率,并且B+树立的元素也是有序的。

    那么,B+树中的一个节点存储多少个元素比较合适呢,也就是说,一个节点要多大比较合适呢?这就是一个问题了。一大堆的扩展知识即将来袭,请做好准备。

    首先,我们需要了解磁盘io的原理。

    先来看机械硬盘:

    87cc5684fe5742d5ed0445feccd52d5d.png

    然后来看机械硬盘的存储原理:

    0f27034a5359b3a892100c4c09604843.png

    一个磁盘由大小相同且同轴的圆形盘片组成,磁盘可以转动(各个磁盘必须同步转动)。在磁盘的一侧有磁头支架,磁头支架固定了一组磁头, 每个磁头负责存取一个磁盘的内容。磁头不能转动,但是可以沿磁盘半径方向运动(实际是斜切向运动),每个磁头同一时刻也必须是同轴的,即从正上方向下看,所有磁头任何时候都是重叠的(不过目前已经有多磁头独立技术,可不受此限制)。

    一般来说一个磁盘有一个盘片,一个盘片对应正反面两个磁头。这叫单碟,特点是比较稳定。现在也有一个磁盘两个盘片,也就是四个磁头。这叫双碟,特点是容量比较大。

    下面是磁盘片的结构图:

    a2e6de031ee42c7d28d326fb76c1ef47.png

    盘片被划分成一系列同心环,圆心是盘片中心,每个同心环叫做一个磁道,所有半径相同的磁道组成-个柱面。磁道被沿半径线划分成一个个小的段, 每个段叫做一个扇区,每个扇区是磁盘的最小存储单元,大小一般为521字节。

    然后我们来看磁盘读取数据的逻辑:

    9a78e7474243c57df1a1239dd6bd3ca5.png

    当需要从磁盘读取数据时,系统会将数据逻辑地址传给磁盘,磁盘的控制电路按照寻址逻辑将逻辑地址翻译成物理地址,即确定要读的数据在哪个磁道,哪个扇区。为了读取这个扇区的数据,需要将磁头放到这个扇区上方,为了实现这一点,磁头需要移动对准相应磁道,这个过程叫做寻道,所耗费时间叫做寻道时间,然后磁盘旋转将目标扇区旋转到磁头下,这个过程耗费的时间叫做旋转时间。

    然后我们再来看固态硬盘:

    3b39d5110728e1859eca1a99ec65671d.png

    固态硬盘(Solid State Drives),用固态电子 存储芯片阵列而制成的硬盘,由控制单元和存储单元(FLASH芯片、DRAM芯片)组成。固态硬盘在接口的规范和定义、功能及使用方法上与普通硬盘的完全相同,在产品外形和尺寸上也完全与普通硬盘-致。

    控制单元

    每个SSD都有一个控制器(cotollen)将存储单元连接到电脑,主控器可以通过若干个通道(channel) 并行操作多块存储单元

    存储单元

    -个Flash Page由两个或者多个Die(又称chips组成),这些Dies可以共享10数据总线和一些控制信号线。一个Die又可以分为多个Plane,而每个Plane又包含多个多个Block,每个Block又分为多个Page。以Samsung 4GBFlash为例,一个4GB的Flash Page由两个2GB的Die组成,共享8位I/0数据总线和一些控制信号线。每个Die由4个Plane组成,每个Plane包含2048个Block,每个Block又包含64个4KB大小的Page

    访问SSD的原理

    Host是通过LBA (Logical BlockAddress,逻辑地址块)访问SSD的,每个LBA代表着一个Sector (- 般为512B大小,操作系统一般以4K为 单位访问SSD,我们把Host访问SSD的基本单元叫用户页(Host Page)。而在SSD内部,SSD主控与Flash之间是Flash Page为基本单元访问Flash的,我们称Flash Page为物理页(PhysicalPage)。 Host每写入-个Host Page, SSD主控会找-个Physical Page把Host数据写入,SSD内部同时记录了这样一条映射(Map) 。有了这样-个映射关系后,下次Host需 要读某个Host Page时,SSD就知道从Flash的哪个位置把数据读取上来。

    局部性原理与磁盘预读

    计算机科学中著名的局部性原理:当一个数据被用到时,其附近的数据也通常会马上被使用。

    所以操作系统为了提高效率,读取数据时往往不是严格按需读取,而是每次都会预读,即使只需要一个字节,操作系统也会从这个位置开始,顺序向后读取一定长度的数据放入内存。这里的-定长度叫做页,也就是操作系统操作磁盘时的基本单位。一般操作系统中 一页的大小是4Kb。

    从上面的原理我们也能知道,固态硬盘比机械硬盘快的最根本最简单的原因就是:固态硬盘使用的电路进行读写,而机械硬盘使用的机械运动。
    其实不管是机械硬盘还是固态硬盘都是存储介质,真正控制读写的是操作系统。

    这部分属于计算机原理和操作系统方面的知识,感觉理解一下还是很有必要的。如果还看过我在操作系统专栏中写的内存管理方面的请求段页式存储,相信大家会更有所感悟。

    所以,回到我们的问题,B+树中一个节点到底存多少个元素合适?,其实也可以换个角度来思考B+树中一个节点到底多大合适?

    答案是: B+树中一个节点为一页或页的倍数最为合适。因为如果一个节点的大小小于1页,那么读取这个节点的时候其实也会读出1页,造成资源的浪费;如果一个节点的大小大于1页,比如1.2页,那么读取这个节点的时候会读出2页,也会造成资源的浪费;所以为了不造成浪费,所以最后把一个节点的大小控制在1页、2页、3页、4页等倍数页大小最为合适。

    那么,Mysql中B+树的一个节点大小为多大呢?

    这个问题的答案是“1页"”,这里说的页"是Mysq自定义的单位(其实和操作系统类似),Mysql的nnodb引擎中一页的默认大小是16k (如果操作系统中-页大小是4k,那么Mysql中1 页=操作系统中4页),可以使用命令SHOW GLOBAL STATUS like 'Innodb_ page size';查看。 并且还可以告诉你的是,一个节点为1页就够了。

    为什么一个节点为一页(16kb)就够了呢?

    先来看看mylsam和innodb使用B+树的情况:

    7d2223991694498c0c102039e7062e72.png

    通常我们认为B+树的非叶子节点不存储数据,只有叶子节点才存储数据。而B树的非叶子节点和叶子节点都会存储数据,这会导致非叶子节点存储的索引值更少,树的高度相对会比B+树高,平均的io效率会比较低,所以使用B+树作为索引的数据结构,再加上B+树的叶子节点之间会有指针相连,便于范围查询。上图的data区域两个存储引擎会有所不同,也就是聚族和非聚族索引的区别。后面详细讲解。

    (这里说一下我对这里的为啥B树的高度相对B+树高的理解:就如上图所见,一个节点指的是

    639247d3fd59e49c1400b36915283609.png

    这才是一个节点,而不是单纯的15,或者加上旁边的一个指针。这样的话,前面已知一个节点是16kb大小,那么在这固定大小中,B树的非叶子节点还要存储数据,而B+树只存储值和指针。具体一点就是,假设数据大小2kb,值大小1kb,指针大小1kb。那么B树里只能有4个值,而B+树里则有8个值,这样的话,整个索引存储相同数量的值的话,B+树明显就比B树低,这样就提高了磁盘的io效率)

    前面我们提到数据区域存储的东西,现在来进行详细解释:

    myisam中,叶子节点的数据区域存储的是数据记录的地址。这也叫非聚族索引。

    下面是主键索引:

    46577682de5a04afcb18d2c5a0443a2c.png

    下面是辅助索引:

    16959176d550bddcd36370424a6f2af3.png

    从图中看得出来,叶子节点中只存储着地址(也就是此值对应的记录的所在地址),找到对应的地址,然后去地址中取出数据。并且主键索引和辅助索引并没有太多区别。

    然后再来看innodb中的B+树:

    下面是主键索引:

    22363bc5d0946386edbd05c822864d05.png

    下面是辅助索引:

    b69c36fce9142130a207fa720fe30f16.png

    innodb的主键索引和实际数据是绑定在一起的也就是说innodb的表一定要有一个主键索引,如果一个表没有手动创建一个主键索引,innodb会查看有没有唯一索引,如果有,则选用唯一索引作为主键,如果连唯一索引也没有,则会默认建立一个隐藏的主键索引(用户不可见)

    另外,innodb的主键索引要比myisam的的主键索引查询效率较高(少一次磁盘io),并且比辅助索引也要高很多。(这里不是很理解。。。。)

    所以,我们在使用innodb作为存储引擎时,要注意:

    1.手动建立一个主键索引

    2.尽量利用主键索引进行查询

    默默表示,看到这里对主键索引,辅助索引,聚族索引,非聚族索引有点理解不过来了。。。

    后面慢慢缓冲。。

    回到我们的问题:为什么一个节点为1页(16k) 就够了?

    对着上面Mysql中Innodb中对B+树的实际应用(主要看主键索引),我们可以发现,B+树中的一个节点存储的内容是:

    非叶子节点 : 主键+指针

    叶子节点 : 数据

    那么,假设我们一行数据大小为1K,那么一页就能存16条数据,也就是一个叶子节点能存16条数据;

    再看非叶子节点,假设主键ID为bigint类型, 那么长度为8B,指针大小在Innodb源码中为6B,-共就是14B,那么一页里就可以存储16K/14=1170个(主键+指针),那么一颗高度 为2的B+树能存储的数据为:

    1170*16=18720条,一 颗高度为3的B+树能存储的数据为: 1170*1170*16=21902400 (千万级条)。所以在InnoDB中B+树高度一般为1-3层, 它就能满足千万级的数据存储。在查找数据时一次页的查找代表一次IO,所以通过主键索引查询通常只需要1-3次IO操作即可查找到数据。所以也就回答了我们的问题,1 页=16k这么设置是比较合适的,是适用大多数的企业的,当然这个值是可以修改的,所以也能根据业务的时间情况进行调整。

    接着,我们来联系这次学到的索引底层原理再来看看我常常见到的最左前辍原则:

    比如有下面这个B+树索引,我们建立了一个联合索引,顺序是emp_no,title,from_data.既然是联合索引,那么它们按理说应该是放在一起连续存放的。

    ed7f5047ffa95479f1512e2450cdf997.png

    我们判断一 个查询条件能不能用到索引,我们要分析这个查询条件能不能利用某个索引缩小查询范围

    对于select * from employees.titles where emp_ no = 1是能用到索引的,因为它能利用上面的索引缩小所有查询范围,首先和第一个节点"4-r-01"比较,1<4, 所以可以直接确定结果在左子树,同理,依次按顺序进行比较,逐步可以缩小查询范围。

    对于select * from employees. titles where title =‘1’是不能用到索引的,因为它不能用到上面的索引,和第一节点进行比较时,没有emp_ no这个字段的值,不能确定到底该去左子树还是右子树继续进行查询。

    对于select * from employees.titles where title =‘1’and emp_ no = 1是能用到索引,按照我们的上面的分析,先用ttle='1 这个条件和第一个节点进行比较,是没有结果的,但是mysql会对这个sql进行优化,优化之后会将emp_ no=1这个条件放到第一位,从而可以利用索引。这里是使用了mysql的查询优化器。

    Mysq总结

    1. B+树可以更好的结合磁盘IO原理提高查询效率

    2. Innodb一 定要有主键,没有主键会以唯一索引为主键, 否则会建立一个隐藏主键

    3. Innodb的数据是和主键索引存在一起的(数据在叶子节点中,MyISAM中的叶子节点存储的数据地址)

    4.建立索引时要考虑已有索引,一个SQL语句只会选择花费最低的一个索引执行

    5.索引是一种有序的数据结构(B+树) ,一个节点可以存多个有序的元素,所以要利用好最左前缀原则6.真实场景中一颗B+树的高度通常为3

    感觉这里涉及的知识比较多,需要好好消化,后面再进行深入理解。

    欢迎交流讨论。

    在这里更新一波,自己之前学习的都太表面了,这些课堂主要还是为了吸引学生去学习,很多东西都抽象出来进行讲解,结果是看起来好像明白了,仔细思考就不行了,禁不住别人灵魂的质问。唉,在这里推荐一个

    掘金小册juejin.im

    掘金的教程,简直把索引主键什么的讲解得不能再透彻了,而且讲解得很系统,很少不能解释的点。

    SnailClimb:可能是全网最好的MySQL重要知识点/面试题总结zhuanlan.zhihu.com
    c211977c377ac42e75de0a921c8f8f97.png

    这篇文章虽然也有涉及,但是不系统,导致的结果就是懂的人懂,不懂的人还是不懂。。。

    展开全文
  • Reference:你心里没点b树,敢说你懂数据库索引底层原理? 要了解数据库索引的底层原理,我们就得先了解一种叫树的数据结构,而树中很经典的一种数据结构就是二叉树!所以下面我们就从二叉树到平衡二叉树,再到B-树...
  • mysql索引底层原理mysql 引擎什么是索引数据结构什么是B树B树结构图什么是B+树两者有什么不同之处mysql索引为什么用B+树了解了mysql 索引底层有什么用 mysql 引擎 MyISAM 引擎和 InnoDb引擎 用表对比: 引擎 主...
  • 原标题:深入理解 MySQL 索引底层原理来源:junshili @ 腾讯技术工程一步一步推导出 Mysql 索引的底层数据结构。Mysql 作为互联网中非常热门的数据库,其底层的存储引擎和数据检索引擎的设计非常重要,尤其是 Mysql ...
  • Mysql索引底层原理分析, Mysql索引的本质 Mysql索引的底层原理 Mysql索引的实战经验 面试 问:数据库中最常见的慢查询优化方式是什么? 同学A:加索引。 问:为什么加索引能优化慢查询?同学A:…不知道同学B:因为...
  • MySQL的索引底层原理

    2020-03-24 22:24:57
    mysql的索引底层原理什么是索引MySQL索引原理为什么MySQL的索引选择B+tree?提高磁盘数据读写速度原理二叉查找平衡树、B-tree、B+tree、红黑树性能分析MySQL引擎MyISAMInnoDB 什么是索引 索引是一种数据结构,用于...
  • 深入理解 Mysql 索引底层原理 - https://zhuanlan.zhihu.com/p/113917726
  • 微信公众号:Java患者专注Java领域技术分享MySQL索引底层原理局部性与页在操作系统中,我们执行一个指令去磁盘取数据,那么他会从磁盘取出4KB数据,这个4KB就是一个局部单位,而这4KB数据就是你的指令中取出的数据周围的...
  • mysql索引概述什么是索引索引是一种高效获取数据的数据结构,...聚集索引,非聚集索引Mysql 索引底层数据结构选型Hash索引介绍hash索引基于哈希表实现,存储引擎会对索引列使用哈希算法,计算一个哈希码(hash code)...
  • 由浅入深全面分析MySQL索引底层原理 1、索引基础 索引是MySQL优化中最重要的手段之一,本文从基础到原理,让你重新认识并掌握索引。 1.1 什么是索引 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取...
  • 参考文章:mysql的索引底层原理 什么是索引 概念:索引是提高mysql查询效率的数据结构。总的一句话概括就是索引是一种数据结构。 数据库查询是数据库的最主要功能之一。设计者们都希望查询数据的速度能尽可能的...
  • mysql索引概述什么是索引索引是一种高效获取数据的数据结构,...聚集索引,非聚集索引Mysql 索引底层数据结构选型Hash索引介绍hash索引基于哈希表实现,存储引擎会对索引列使用哈希算法,计算一个哈希码(hash code)...
  • Mysql索引底层原理与性能优化 在一般的开发中不会有碰到数据结构、算法的一些底层东西。但是了解了之后会对你的开发有很大的帮助。最近学习了一下。做一个笔记。更深的学习,请看相关书籍或视频。 一、索引是帮助...
  • Mysql 的索引底层原理1.什么是索引?索引是一种排好序的数据结构,mysql目前默认使用的是b+树。2.为什么使用b+树?例如表table 数据idname1zs2ls3sa4zl5wmz6zs7sd这这个表里,没有加索引,要查询id= 6的数据,至少要...
  • 一文全面深入理解 Mysql 索引底层原理 本文旨在一步一步推导出 Mysql 索引的底层数据结构。 Mysql 作为互联网中非常热门的数据库,其底层的存储引擎和数据检索引擎的设计非常重要,尤其是 Mysql 数据的存储形式以及...
  • 摘要本文介绍MySQL的InnoDB索引相对底层原理相关知识,涉及到B+Tree索引和Hash索引,但本文主要介绍B+Tree索引,其中包括聚簇索引和非聚簇索引,InnoDB数据页结构详解,B+Tree索引的使用以及优化,同时还有B+Tree...
  • Mysql 的索引底层原理 1.什么是索引? 索引是一种排好序的数据结构,mysql目前默认使用的是b+树。 2.为什么使用b+树? 例如表table 数据 id name 1 zs 2 ls 3 sa 4 zl 5 wmz ...
  • 深入浅出:Mysql索引底层原理一 索引的概念简介二 为什么是B+ Tree1,二叉树2,红黑树3 B-Tree三 如何做到支持千万级表查四 myIsam和Innodb存储引擎的索引实现五 横向指针的作用浅出总结: 一 索引的概念简介 对于...
  • 数据库索引底层原理

    2020-08-20 15:24:32
    二叉树到平衡二叉树,再到 B- 树,最后到 B+ 树来一步一步了解数据库索引底层原理! 二叉树(Binary Search Trees) 二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(Left Subtree...
  • 数据库的底层索引是用B树和B+树实现的,但是为什么使用的是它们,为什么不用红黑树?红黑树等数据结构也可以用来实现索引,但是文件系统以及数据库系统普遍采用B-Tree/B+Tree作为索引结构.这是因为:索引本身也很大,因此...
  • Mysql索引的本质Mysql索引底层原理Mysql索引的实战经验面试问:数据库中最常见的慢查询优化方式是什么?答:加索引。问:为什么加索引能优化慢查询?答1:...不知道答2:因为索引其实就是一种优化查询的数据结构,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,057
精华内容 822
关键字:

索引底层原理