一文让你对mysql索引底层实现明明白白

这篇具有很好参考价值的文章主要介绍了一文让你对mysql索引底层实现明明白白。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

开篇:

图片是本人随笔画的,有点粗糙,望大家谅解,如有不妥之处,请联系我们,感谢

一、索引到底是什么

.索引是帮助mysql高效获取数据的排好序的数据结构

.索引是存储在文件里的

.数据结构: 二叉树 HASH BTREE

 

 

 

如果没有索引的话,循环一条一条的找,找一次就是一次IO,这样速度就会很慢

我们知道数据库数据都是存在磁盘上的,当我们查找数据时,就会从磁盘上取数据,每取一次就是一次IO,IO是非常耗时的,为了速度快会把数据放到缓存里,然后在缓存里进行操作

 

二、磁盘存取原理

 

 

 

当查找数据的时候,就是磁头循环找此道,就会一直循环查找,一次查找就是一次IO,IO是很耗时的

三、Mysql数据结构详解

就拿上面的7条数据来说,如果没有索引,当我们查找第7条数据时,就会循环7次,如果有百万级别的数据,那么就会查找百万次,显然这样是不行的,就需要数据结构算法来优化,那我们就从二叉树----HASH---BTREE来一一说起

二叉树:

二叉树节点保存的都是单个索引,高度会随着数据增大而增高,但是比一条一条的循环会快

 

 

 

 

 

 

不用二叉树是因为的极端情况下会出现单边增长,这样在数量大的情况下,和一条一条查找没有区别。

红黑树:

红黑树有自平衡性质,不会出现单边增长,它会动态自旋转,在性能上比二叉树又高一点,但是mysql也没有用这种数据结构,因为数据量超大的情况下,数据高度也会一直增大,在最终这个树高度也非常大,解决不了根本问题

 

 

 

HASH:

hash算法一次就会定位到文件指针,速度快,但是还是没有用,如果范围查找的话就没有办法了,如果只是内存中的话,他的时间复杂度是O(1),速度会会很快,但是索引文件也是保存在磁盘上,而且hash是不连续的放在磁盘上的,这样查询起来也很慢,这才是不用hash的最根本原因

 

 

 

B-TREE:

相比上面的数据结构,b-tree增加了横向大小(度Degree),那么在高度上就减小了,查找次数就少了

 

 

 

15,56,77.。。。。是索引,data就是对应的一行数据

那么在横向的度上最大多少合适呢??总不能横向上一直扩展下呀,磁盘一次IO,就是取一个横向的节点(度),把一个节点的数据放在缓存中,那么一次IO也不能把所用的数据全取出来,所以最好是一次io,就把这个节点全取处理,电脑操作系统从磁盘一次取数据到内存中一般是4K,而mysql取一次数据一般是16K,所以横向节点一般设置为16K。因为一个节点设置成16K的话,这个节点保存了索引和索引对应行的数据,那么这个节点横向保存不了太多的数据,所以,这种数据结构也不合适,引入新的数据结构

 

 

 

B+Tree

查找一次数据就是和磁盘一次IO,一次IO会把这个数据相邻的数据一下全部查处理,这样速度会更快,这样的一页就是咱们说的一个节点(4K),分配空间的时候也是一页一页分配的,这样会更快,一页就是一个节点

 

 

 

 

mysql 常用的引擎有MyISAM和InNoDb,两种引擎得索引结构是不一样的

MyISAM的数据结构:

.frm表结构文件 .myd表数据文件 .myi表索引文件

 

 

 

 

 

 

myisam引擎的主键索引数据结构是左上图,普通索引是右上图,叶子节点存的不是数据本身,是数据文件指针,和b_tree数据不一样,注意:每类的索引,都是各自的树,不是混合在一起的

 

.frm表结构文件 .ibd 表数据和索引文件

 

 

 

 

 

 

主键索引是聚集索引,因为叶子节点是所有的数据,就是一行数据,非主键索引叶子节点只包括索引和主键,再用主键找对应数据

非主键索引叶子节点只包括索引和主键,再用主键找对应数据,这样是为了节省空间和数据一致性

 

联合索引:

要满足最左原则

联合索引(col1, col2, col3)也是一棵B+树,其非叶子节点存储的是第一个关键字的索引,而叶子节点存储的则是三个关键字col1、col2、col3三个关键字的数据,且按照col1-col2-col3的顺序进行排序。

 

 

 

 

 

例如:

如果执行的是,SELECT * FROM T WHERE B=‘Tom’ AND C=4567;

那么无法使用索引,因为索引是用A字段先排序的,如果没有先确定A,直接查找B和C,那么将会是全表查询。

 

如果执行的是,SELECT * FROM T WHERE A=‘30’ ;

那么,会先找到A字段,再在A等于30的数据中(比如有很多条),找B等于Demi的数据。这样是可以用到索引的。

 

如果执行的是,SELECT * FROM T WHERE A=‘18’ AND C=1234;

那么,A字段可以索引,而C不能索引。所以可以部分索引,也比全表查询快。

 

如果执行 SELECT * FROM T WHERE B=Demi AND C=1234 and A=‘18’

是用到索引的,在and的情况下如果把第一个放到最后位置也是能用到索引的

 

现在我想大家应该了解了什么为什么是最左原则。因为,B+树是按照最左边的字段以此构建的。

作者:京东零售 韩航云

来源:京东云开发者社区 转载请注明来源文章来源地址https://www.toymoban.com/news/detail-793738.html

到了这里,关于一文让你对mysql索引底层实现明明白白的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL索引底层:B+树详解

    MySQL索引底层:B+树详解 前言 当我们发现SQL执行很慢的时候,自然而然想到的就是加索引。对于范围查询,索引的底层结构就是B+树。今天我们一起来学习一下B+树 树的简介 树跟数组、链表、堆栈一样,是一种数据结构。它由有限个节点,组成具有层次关系的集合。因为它看

    2024年04月23日
    浏览(15)
  • MySQL 底层数据结构 聚簇索引以及二级索引 Explain的使用

    我们知道MySQL的存储引擎Innodb默认底层是使用B+树的变种来存储数据的 下面我们来复习一下B树存储 + B树存储  + 哈希存储的区别 哈希存储,只能使用等值查询 B树与B+树存储 我们知道B+树实际上就是B树的变种 那么为啥使用B+树而不是使用B树呢? 我们知道效率的高低主要取决于

    2024年04月28日
    浏览(34)
  • MySQL索引:让你的数据库查询快到起飞!

    💕世界上最美好的东西之一,就是你每天都有机会开始全新的一天。💕 🐼作者:不能再留遗憾了🐼 🎆专栏:MySQL学习🎆 🚗本文章主要内容:详细介绍如何查看、创建和删除MySQL索引,以及MySQL索引的底层原理:B+树。🚗 各位朋友们,大家好!前面我们已经介绍了MySQL的库

    2024年02月09日
    浏览(32)
  • MySQL:一文掌握MySQL索引

    官方定义:索引(Index)是帮助MySQL高效获取数据的数据结构。 在数据库中,索引被定义为一种特殊的数据结构,由数据库中的一列或多列组合而成,可以用来快速查询数据表中某一特定值的记录,就像一本书的目录一样。索引是在表的字段的基础上建立的一种数据库对象。

    2024年02月05日
    浏览(32)
  • MySQL为什么采用B+树作为索引底层数据结构?

            索引就像一本书的目录,通过索引可以快速找到我们想要找的内容。那么什么样的数据结构可以用来实现索引呢?我们可能会想到:二叉查找树,平衡搜索树,或者是B树等等一系列的数据结构,那么为什么MySQL最终选择了B+树作为索引的数据结构呢?         要想

    2024年02月16日
    浏览(36)
  • 【MYSQL篇】一文弄懂mysql索引原理

    MySQL 数据库应该是最常用的数据库之一,在各种大大小小的公司都可以看到它的身影,你对 MySQL 数据库掌握的如何呢?想要更好的使用它,那么我们就必须先了解它,正所谓的 工欲善其事,必先利其器 。 本篇文章就带领大家一起来深入剖析MySQL索引的一些知识,先来了解什

    2024年02月09日
    浏览(58)
  • 一文搞懂 MySQL 索引

    1、MySQL 索引 简介 1.1、MySQL 索引 是什么?  索引是一个单独的、存储在 磁盘 上的 数据库结构 ,包含着对数据表里 所有记录的 引用指针。 1.2、 MySQL 索引 的存储类型有哪些?  MySQL中索引的存储类型有两种,即 BTree 和 Hash。 1.3、MySQL 索引 在哪里实现的?  索引是在存储

    2024年02月04日
    浏览(34)
  • 让你对es有一个初步的了解

    首先es在海量数据的搜索能力非常好,es你可以把他看成一个搜索引擎数据库,他是个非关系型数据库。他的语法有很大的不同,好像都是json风格的。还有一点需要说的就是es 的数据是存在硬盘上的, 我们先来看一下mysql和es的区别吧。一张图给展示出来。 仔细上图的同时,

    2024年02月11日
    浏览(34)
  • 一文读懂 MySQL 中的索引

    MySQL官方对索引的 定义 为:索引(Index)是帮助MySQL高效获取数据的数据结构。 索引的本质 :索引是数据结构。你可以简单理解为“排好序的快速查找数据结构”,满足特定查找算法。 这些数据结构以某种方式指向数据, 这样就可以在这些数据结构的基础上实现 高级查找算

    2024年02月16日
    浏览(28)
  • 倒排索引:ES倒排索引底层原理及FST算法的实现过程

    这也许是你全网你能找到的最详细的倒排索引的底层解读。博主把倒排索引的讲解划分为以下七个部分,理解难度递增,可根据自身需要选择依次阅读或者针对性阅读。 通常来说,应付一般的面试,理解第一部分即可。如果需要面试搜索相关业务的岗位,需要深层次理解倒排

    2024年01月21日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包