首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

浅入浅出 MySQL 索引

在 MySQL InnoDB 的实际实现中,页节点之间其实是个双链表,存储了分别指向上一个、下一个节点的指针 下图是包含了整数「1-7」的B树,这个图应该会帮助你加深对两者区别的理解。...InnoDB 会将数据存储在磁盘上,而当我们查询数据的时候,OS 会将存储在磁盘上的数据一页一页的加载到内存里。...这里的页是 OS 管理内存的一种方式,当其加载数据到内存时,会将某个磁盘块上的数据按照页的大小加载。在这里,你可以理解为B树中每个节点就是一个磁盘块。...那就在数据量相同的情况下,不会因为你查询的数据 ID 不同而造成查询所耗费时间大相径庭,换句话说,这次请求可能花了10ms,下一次同样的请求啪的一下花了20ms,这就让人很不能接受,合着接口的性能还要看你数据库的心情...然后是旋转,磁盘会将存储对应数据的盘片旋转至磁头下方,这又花掉2ms左右,具体的时延与磁盘的转速有关。 最后是数据传输。 一波操作下来,花费就在10ms左右。

37430

浅入浅出 MySQL 索引

在 MySQL InnoDB 的实际实现中,页节点之间其实是个双链表,存储了分别指向上一个、下一个节点的指针 下图是包含了整数「1-7」的B树,这个图应该会帮助你加深对两者区别的理解。...InnoDB 会将数据存储在磁盘上,而当我们查询数据的时候,OS 会将存储在磁盘上的数据一页一页的加载到内存里。...这里的页是 OS 管理内存的一种方式,当其加载数据到内存时,会将某个磁盘块上的数据按照页的大小加载。在这里,你可以理解为B树中每个节点就是一个磁盘块。...那就在数据量相同的情况下,不会因为你查询的数据 ID 不同而造成查询所耗费时间大相径庭,换句话说,这次请求可能花了10ms,下一次同样的请求啪的一下花了20ms,这就让人很不能接受,合着接口的性能还要看你数据库的心情...然后是旋转,磁盘会将存储对应数据的盘片旋转至磁头下方,这又花掉2ms左右,具体的时延与磁盘的转速有关。 最后是数据传输。 一波操作下来,花费就在10ms左右。

29310
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    红黑树、B树、B+树

    为什么不能使用二叉树来存储数据库索引 先说结论: 平衡二叉树进行插入/删除时,大概率需要通过左旋/右旋来维持平衡; 旋转需要加载整个树,频繁旋转效率低; 二叉树的 I/O 次数近似为 O(log2(n)...); 范围查询时,二叉树的时间复杂度会退化成 O(n); 二叉树退化成链表时,时间复杂度也近似退化成了 O(n); 二叉树无法使用磁盘预读功能; 其实单论范围查询,在关系型数据库中就基本没有使用二叉树的可能了...: 非叶子节点不存储数据,进一步增大了一页中存储关键字的数量; 叶子节点中存储数据且存在指向下一页的链表指针,可以使用顺序查询(支持范围查询); 6....page 标记如下,有助理解: 理解 虽然叶子节点很多,一个 page 对应一个叶子节点甚至是多个 page 才能存下一个叶子节点,但是这些是存在磁盘上的,找到对应的 page 之后才去加载对应的 page...而 B 树更适合键值对型的聚合数据库,比如 MongoDB,查询次数最优为 O(1); 红黑树更适合内存存储,B 树更适合键值对存储,B+ 树适合范围查询;

    87140

    红黑树、B树、B+树

    为什么不能使用二叉树来存储数据库索引 先说结论: 平衡二叉树进行插入/删除时,大概率需要通过左旋/右旋来维持平衡; 旋转需要加载整个树,频繁旋转效率低; 二叉树的 I/O 次数近似为 O(log2(n)...); 范围查询时,二叉树的时间复杂度会退化成 O(n); 二叉树退化成链表时,时间复杂度也近似退化成了 O(n); 二叉树无法使用磁盘预读功能; 其实单论范围查询,在关系型数据库中就基本没有使用二叉树的可能了...: 非叶子节点不存储数据,进一步增大了一页中存储关键字的数量; 叶子节点中存储数据且存在指向下一页的链表指针,可以使用顺序查询(支持范围查询); 6....page 标记如下,有助理解: 理解 虽然叶子节点很多,一个 page 对应一个叶子节点甚至是多个 page 才能存下一个叶子节点,但是这些是存在磁盘上的,找到对应的 page 之后才去加载对应的 page...而 B 树更适合键值对型的聚合数据库,比如 MongoDB,查询次数最优为 O(1); 红黑树更适合内存存储,B 树更适合键值对存储,B+ 树适合范围查询;

    69700

    美团技术报告:83%的Android开发者因这5个源码盲区错失年薪50万(附50k+面试答案)

    大家好,我是稳稳,一个曾经励志用技术改变世界,现在为随时失业做准备的中年奶爸程序员,与你分享生活和学习的点滴。 今天温度直上30度,明天却最低不到10度,像极了这人生跌宕起伏啊!...二、大厂必问的7个Jetpack源码命题 1. ViewModel的"僵尸复活"机制(字节跳动压轴题) 场景:某电商App屏幕旋转后购物车数据丢失,如何用ViewModel解决?...LiveData的"幽灵通知"陷阱(阿里P8夺命题) 现象:新注册的Observer总是收到最后一次数据(如重复跳转登录页) 源码解析: 粘性事件原理:mVersion版本计数器触发considerNotify...Room的"ORM黑洞"优化(抖音数据库实战) 性能陷阱: 同步查询阻塞UI线程(卡顿率提升58%) 多表操作未用@Transaction包裹(数据不一致风险达33%) 终极方案: @Query...fun getUsersStream(): Flow> // Flow实时更新 数据对比:抖音评论加载耗时降低65%。

    8510

    Mysql进阶垫脚石 -- Sql命令的执行状态有哪几种

    ,例如查询,需要经过copying to tmp table,Sorting result,Sending data等状态才可以完成 Info 显示这个sql语句,因为长度有限,所以长的sql语句就显示不全...12.Sorting for group 正在为 GROUP BY 做排序。 13.Sorting for order 正在为 ORDER BY 做排序。...正尝试打开一个表。 15.Removing duplicates 正在执行一个 SELECT DISTINCT 方式的查询,但是MySQL无法在前一个阶段优化掉那些重复的记录。...除了服务器硬件的性能瓶颈,对于MySQL系统本身,我们可以使用工具来优化数据库的性能,通常有三种:使用索引,使用EXPLAIN分析查询以及调整MySQL的内部配置。...在优化MySQL时,通常需要对数据库进行分析,常见的分析手段有慢查询日志,EXPLAIN 分析查询,profiling分析以及show命令查询系统状态及系统变量,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能

    72050

    Mysql中的索引

    ) 一条sql是怎么样执行的 应用程序通过账户名,密码连接到Mysql数据库服务器,然后将sql语句发送到Mysql服务器。...查询缓存:接着Mysql服务器会去查询缓存,看看是不是有这条sql的缓存结果,key是查询的语句,value的查询到的结果集。如果能直接命中缓存,则直接返回。...表->段->区->页->行 在数据库中,不论读哪一行数据,还是读多行数据,都是将这些行所在的页进行加载。也就是存储空间的基本单位就是页。...一个页就是一颗B+树的节点,数据库I/O操作的最小单位是页,与数据库相关的内容都会存储在页的结构里。 img 在一棵B+树中,每个节点都是一个页,每次新建节点的时候,就会新建一个页。...因此页目录中提供了二分查找,来提高检索的效率 B+树的检索过程 从B+树的跟开始,逐层找到叶子节点 找到叶子节点对应的数据页,将数据页加载到内存中,通过页目录的㯾大致找到数据所在的分组 在分组中通过聊表的遍历找到记录

    3.3K20

    MySQL索引底层数据结构

    1、索引是帮助数据库高效获取数据的排好序的数据结构。 2、索引存储在文件中。 3、索引建多了会影响增删改效率。...(下面这张图为计算机组成原理内容,每查询一次索引节点,都会进行一次磁盘IO读取,即要寻道和旋转) 二、MySQL索引结构为什么是B+树?...从磁盘中把大节点查找出来,把这个大节点加载进内存中,节点77实际上是在内存中查找的,在内存中做的是随机访问,速度很快,跟磁盘的寻道和旋转相比的话,基本可以忽略不计。...(度的含义:节点的数据存储个数) 本来是想通过一次IO操作把一个大节点加载进内存,如果一个大节点的数据量太大的话, 则内存和硬盘一次交互没办法交换那么多数据,假设一次只能交换1页(4k)的数据(有上限,...(一个大节点的尾节点和下一个大节点的头节点之间的指针连接) 方便范围查询。

    66720

    深入理解数据库索引原理

    数据库也是一样,但显然要复杂许多,因为不仅面临着等值查询,还有范围查询(>、查询(like)、并集查询(or)等等。数据库应该选择怎么样的方式来应对所有的问题呢?...,主流磁盘一般在5ms以下;旋转延迟就是我们经常听说的磁盘转速,比如一个磁盘7200转,表示每分钟能转7200次,也就是说1秒钟能转120次,旋转延迟就是1/120/2 = 4.17ms;传输时间指的是从磁盘读出或将数据写入磁盘的时间...每一次IO读取的数据我们称之为一页(page)。具体一页有多大数据跟操作系统有关,一般为4k或8k,也就是我们读取一页内的数据时候,实际上才发生了一次IO,这个理论对于索引的数据结构设计非常有帮助。...IO)可以忽略不计,通过磁盘块1的P2指针的磁盘地址把磁盘块3由磁盘加载到内存,发生第二次IO,29在26和30之间,锁定磁盘块3的P2指针,通过指针加载磁盘块8到内存,发生第三次IO,同时内存中做二分查找找到...name来搜索才能知道下一步去哪里查询。

    88210

    mysql学习之优化总结(2)--索引的那些事

    我们先来看看没有索引时数据的查询过程: 如下图,数据库中的磁盘空间被分为很多不同的block(块),这些块的大小相同,数据是以Row为单位存放在磁盘上的块里。...数据库磁盘结构.png 当我们要定位一条userid为0234的数据时, 查询语句为: select * from user where userid= 0234 为了找出满足条件的查询,数据库管理器必须扫描...2、寻道:磁头移动,对准相应磁道,耗费时间叫做寻道时间 3、磁盘旋转:然后磁盘旋转将目标扇区旋转到磁头下,这个过程耗费的时间叫做旋转时间。...image.png 由于磁盘顺序读取的效率很高(不需要寻道时间,只需很少的旋转时间),因此对于具有局部性的程序来说,预读可以提高I/O效率。 预读的长度一般为页的整倍数。...页是计算机管理存储器的逻辑块,硬件及操作系统往往将主存和磁盘存储区分割为连续的大小相等的块,每个存储块称为一页,主存和磁盘以页为单位交换数据。

    75150

    如何使用桶模式进行分页——第一讲

    下一页也采取类似的处理方式,唯一不同的是,我们用skip 1,000代替skip 0。数据库很容易就找到了2,000个文档并返回1,000个文档。等一下……数据库确实找到了2,000个文档吗?...数据库必须找到5,001,000个文档并返回1,000个文档。难怪会花费那么长的时间!其实,有一个更好的方法。 对文档执行跳过(Skipping)命令很费时间,相反,不对文档执行跳过命令就不费时间了。...使用另一种方法的要点在于:如何在不需要事先加载之前所有数据的情况下加载所需的数值。这种解决方案需要跟踪所查看的最后一个文档,以便找到下一个文档集。...如果使用“skip和limit查找”的老方法显示页面,每一页都要从多个文档循环加载。每页如需显示20条交易,就需要反复20次移动光标,从服务器上提取20个文档。...如需显示第1页,就从服务器提取第一个桶。如需显示第2页,就使用.skip(1) 跳过第一个桶,并从服务器提取第二个桶。如需显示第3页,就从服务器提取第三个桶。

    1.5K20

    【MySQL 系列】MySQL 架构篇

    2.6、SELECT 查询过程 总结一下一条查询 SQL 语句的执行流程: 客户端通过连接器连接 MySQL 服务; 连接成功后向 SQL 接口发送 SQL 语句请求; SQL 接口接收到 SQL 查询语句会先去缓存查询...下一次读取相同的页,先判断是不是在缓冲池里面,如果是,就直接读取,不用再次访问磁盘。 修改数据的时候,先修改缓冲池里面的页。内存的数据页和磁盘数据不一致的时候,我们把它叫做脏页。...思考一个问题:当需要更新一个数据页时,如果数据页在 BufferPool 中存在,那么就直接更新好了。否则的话就需要从磁盘加载到内存,再对内存的数据页进行操作。...3.2.2、ChangeBuffer 如果这个数据页不是唯一索引,不存在数据重复的情况,也就不需要从磁盘加载索引页判断数据是不是重复(唯一性检查)。...如果我们所需要的数据是随机分散在不同页的不同扇区中,那么找到相应的数据需要等到磁臂旋转到指定的页,然后盘片寻找到对应的扇区,才能找到我们所需要的一块数据,依次进行此过程直到找完所有数据,这个就是随机 IO

    1.8K20

    Mysql的索引结构为什么要用B+数

    三、红黑树:树太高 与AVL树相比,红黑树并不追求严格的平衡,而是大致的平衡:只是确保从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。...B树在数据库中有一些应用,如mongodb的索引使用了B树结构。但是在很多数据库应用中,使用了是B树的变种B+树。...Innodb中每个节点使用一个页(page),页的大小为16KB,其中元数据只占大约128字节左右(包括文件管理头信息、页面头信息等等),大多数空间都用来存储数据。...对于非叶节点,记录只包含索引的键和指向下一层节点的指针。假设每个非叶节点页面存储1000条记录,则每条记录大约占用16字节;当索引是整型或较短的字符串时,这个假设是合理的。...; 红黑树:通过舍弃严格的平衡和引入红黑节点,解决了AVL旋转效率过低的问题,但是在磁盘等场景下,树仍然太高,IO次数太多整理了一份328页MySQLPDF文档; B树:通过将二叉树改为多路平衡查找树,

    1.1K30

    Mysql的索引为什么使用B+树而不使用跳表?

    于是顺着的record的页地址就到了6号数据页里,再判断id=5>4,所以肯定在右边的数据页里,于是加载105号数据页。...两层跳表 这样当我想要查询一个数据的时候,我先查上层的链表,就很容易知道数据落在哪个范围,然后跳到下一个层级里进行查询。这样就把搜索范围一下子缩小了一大半。...当数据库表不断插入新的数据时,为了维持B+树的平衡,B+树会不断分裂调整数据页。 我们知道B+树分为叶子结点和非叶子结点。...因此存放同样量级的数据,B+树的高度比跳表的要少,如果放在mysql数据库上来说,就是磁盘IO次数更少,因此B+树查询更快。...而针对写操作,B+树需要拆分合并索引数据页,跳表则独立插入,并根据随机函数确定层数,没有旋转和维持平衡的开销,因此跳表的写入性能会比B+树要好。

    96341

    详述 MySQL 中 InnoDB 的索引结构以及使用 B+ 树实现索引的原因

    然而,BST 可能长歪而变得不平衡,如下图所示,此时 BST 退化为链表,时间复杂度退化为O(n)。 为了解决这个问题,引入了平衡二叉树。...红黑树:树太高 与 AVL 树相比,红黑树并不追求严格的平衡,而是大致的平衡:只是确保从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。...但是对于数据在磁盘等辅助存储设备中的情况(如 MySQL 等数据库),红黑树并不擅长,因为红黑树长得还是太高了。...B 树在数据库中有一些应用,如 MongoDB 的索引使用了 B 树结构。但是在很多数据库应用中,使用了是 B 树的变种 B+ 树。...对于非叶节点,记录只包含索引的键和指向下一层节点的指针。假设每个非叶节点页面存储 1000 条记录,则每条记录大约占用 16 字节;当索引是整型或较短的字符串时,这个假设是合理的。

    1.1K10

    深入浅出索引

    我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。...预读的长度一般为页(page)的整倍数 页是计算机管理存储器的逻辑块,硬件及操作系统往往将主存和磁盘存储区分割为连续的大小相等的块,每个存储块称为一页(在许多操作系统中,页得大小通常为4k),主存和磁盘以页为单位交换数据...如果是一个查询语句,则可以先看查询缓存中是否有结果,如果有结果可以直接返回给客户端。 如果查询缓存中没有结果,就需要真的查询数据库引擎层了,于是发给SQL优化器,进行查询的优化。...在数据库引擎层,要先查询缓存页中有没有相应的数据,如果有则可以直接返回,如果没有就要从磁盘上去读取。...当在磁盘中找到相应的数据之后,则会加载到缓存中来,从而使得后面的查询更加高效,由于内存有限,多采用变通的LRU表来管理缓存页,保证缓存的都是经常访问的数据。

    58420

    从磁盘I_O的角度理解SQL查询的成本

    但是对于磁盘 I/O 来说却需要加载一页的信息,因为页是最小的存储单位。...那么对于数据库来说,如果想要查找多行记录,查询时间是否会成倍地提升呢?其实数据库会采用缓冲池的方式提升页的查找效率。...要知道,这种策略对提升 SQL 语句的查询性能来说至关重要。如果索引的数据在缓冲池里,那么访问的成本就会降低很多。那么缓冲池如何读取数据呢?...缓冲池管理器会尽量将经常使用的数据保存起来,在数据库进行页面读操作的时候,首先会判断该页面是否在缓冲池中,如果存在就直接读取,如果不存在,就会通过内存或磁盘将页面存放到缓冲池中再进行读取。...,另外还有 1ms 的传输时间,将页从磁盘服务器缓冲区传输到数据库缓冲区中。

    2.5K2940

    面试:mysql最全索引与优化详解

    = 15 首先client向server发送更新sql 服务器先去缓存中查询是否有age=10的数据,如果有就返回执行器,否则下一个阶段, 服务器对sql优化,优化器生成执行计划,调用存储引擎 磁盘查询...时间局部性:是由于程序中有大量循环,空间局部性是程序有大量的数组。 mysql 也一样,我们在查询数据时也不是直接将整个表数据加载到内存,而是每次加载磁盘上的一个页的单位进行比较。...+ 下一页的地址,在这一页数据尾加上下一页地址 2.Dynamic: 第一页存放所有数据页的地址,指向存放这行数据的所有页 4....,在进行二叉树查找时每次都可以将一页大小数据加载到内存,查找完再加载下一个页节点,AVL树都是基于内存的算法,必须全部加入到内存。...; SQL 优化过程 开启慢查询并分析 explain + sql 慢查询 show profile 查询sql 在mysql 中的执行细节 数据库服务器参数调优 小表驱动大表 单路排序,从磁盘读取查询所需要的查询列

    73050

    从磁盘I_O的角度理解SQL查询的成本

    但是对于磁盘 I/O 来说却需要加载一页的信息,因为页是最小的存储单位。...那么对于数据库来说,如果想要查找多行记录,查询时间是否会成倍地提升呢?其实数据库会采用缓冲池的方式提升页的查找效率。...要知道,这种策略对提升 SQL 语句的查询性能来说至关重要。如果索引的数据在缓冲池里,那么访问的成本就会降低很多。那么缓冲池如何读取数据呢?...缓冲池管理器会尽量将经常使用的数据保存起来,在数据库进行页面读操作的时候,首先会判断该页面是否在缓冲池中,如果存在就直接读取,如果不存在,就会通过内存或磁盘将页面存放到缓冲池中再进行读取。...,另外还有 1ms 的传输时间,将页从磁盘服务器缓冲区传输到数据库缓冲区中。

    2.5K292
    领券