在InnoDB的数据页到底长什么样?这篇文章里,我们讲了InnoDB数据页长什么样,简单回顾下。

图1 InnoDB数据页结构示意图(图片来自网络)

其中有的部分没有详细讲解,因为暂时还用不到。比如Page Directory页目录。

上面讲了数据页的内部结构,数据库最终所有的数据都是要放到磁盘上去的,那么大量的数据页在磁盘上是怎么存储的呢?其实数据页之间会通过双向链表连接起来。

图2 数据页双向链表连接起来

内存中的双向链表大家都能理解,那么磁盘上的双向链表是怎么搞的呢?

其实,数据页在磁盘上就是一段数据,里面包含的两个指针,一个指向自己上一个数据页的物理地址,一个指向下一个数据页的物理地址。

每个数据页内部的User Records行记录部分会存储一行一行的数据,这些行数据会按照逐渐的大小进行排序存储,每一行数据都有一个指针指向下一行数据的位置,组成单向链表。

图3 数据页在磁盘文件里的物理存储结构

数据页的页目录是个重要的东西,目录的作用就是方便检索。这里的目录,同样有这样的作用。

页目录里有很多个槽位(slots),这个槽位对应一组数据,可以理解为真实数据与页面中第0个字节之间的偏移量。每个槽中,存放着每个组里最大的那条记录所在页面中的地址偏移量。

页目录就存放的是主键与槽位的映射关系,如图:

图4 页目录

所以说,如果你要根据主键查找一条数据,假设你表里没几条数据,那个表就一个数据页,那就直接在数据页里根据主键二分查找。

通过二分查找在目录里迅速定位到逐渐对应的数据在哪个槽位里,然后到那个槽位里去,遍历槽位里的每一行数据,就能找到那个主键对应的数据了。

如果你没办法使用主键查询,只能进到数据页里,逐条数据遍历查找了。

如果数据页里有很多的数据页,该如何查找呢?

假设你没有建立任何索引,只能从第一个数据页开始遍历所有的数据页,从第一个数据页开始,把每个数据也从磁盘加载到buffer pool的缓存页里去。

如果你是根据主键查找,你可以在数据页的页目录里二分查找,如果是根据其他字段查找,就需要在数据页里顺着单链表遍历了。

这个过程,其实就是全表扫描!

你在没有任何所以的时候,查找数据就是一个全表扫描的过程,就是根据双向链表把磁盘上的数据页加载到磁盘的缓存页里去,然后在缓存页内部查找那条数据。

这个过程是非常满的,所以说当数据量大的时候,全表扫描性能非常低,应该尽量避免全表扫描。

深入理解为什么MySQL全表扫描很慢?相关推荐

  1. 33 | MySQL全表扫描会将内存打爆?(看了这篇你就赚)

    一.前言 本篇主要分析全表扫描对server层.引擎层的影响. 二.全表扫描对server层的影响 2.1.server端对结果集的保存流程是什么样的?MySQL 是"边读边发的" ...

  2. mysql什么情况会扫描所有_造成MySQL全表扫描的原因

    全表扫描是数据库搜寻表的每一条记录的过程,直到所有符合给定条件的记录返回为止.通常在数据库中,对无索引的表进行查询一般称为全表扫描:然而有时候我们即便添加了索引,但当我们的SQL语句写的不合理的时候也 ...

  3. mysql 全表扫描、全索引扫描、索引覆盖(覆盖索引)

    full index scan:全索引扫描,查询时,遍历索引树来获取数据行.如果数据不是密集的会产生随机IO 在执行计划中是Type列,index full table scan:通过读物理表获取数据 ...

  4. mysql全表扫描和用索引的区别

    全表扫描的意思就是要把表中所有数据过一遍才能显示数据结果,索引扫描就是索引,只需要扫描一部分数据就可以得到结果, 打个比方吧,在新华字典中,如果没有拼音或笔画索引,当我们查找"做" ...

  5. Facebook对MySQL全表扫描性能的改进

    原文博客如下: http://yoshinorimatsunobu.blogspot.com/2013/10/making-full-table-scan-10x-faster-in.html 如下是 ...

  6. 数据库CPU内存高以及全表扫描的原因

    哪些情况数据库全表扫描 1. 使用null做为判断条件 2. 左模糊查询Like %XXX% 3. 使用or做为连接条件 4. 使用in时(not in) 5.使用not in时 6.使用!=或< ...

  7. MYSQL的全表扫描,主键索引(聚集索引、第一索引),非主键索引(非聚集索引、第二索引),覆盖索引四种不同查询的分析...

    文章出处:http://inter12.iteye.com/blog/1430144 MYSQL的全表扫描,主键索引(聚集索引.第一索引),非主键索引(非聚集索引.第二索引),覆盖索引四种不同查询的分 ...

  8. MYSQL避免全表扫描__如何查看sql查询是否用到索引(mysql)

    MYSQL避免全表扫描 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引 2.应尽量避免在 where 子句中对字段进行 null 值判断,否 ...

  9. 范围查找(比如日期范围)下查询出现全表扫描MySQL数据库索引失效

    范围查找(比如日期范围)下查询出现全表扫描MySQL数据库索引失效 当下MySQL数据库在多款数据库中脱颖而出,成为使用最广泛的数据库之一,这里我们来看看数据库索引上的一个问题.我们知道在数据量上去以 ...

最新文章

  1. 阿里云服务器安装Ubuntu图形化界面
  2. Python爬虫之urllib模块2
  3. Sympy常见多个变量【一行代码创建】
  4. 字符串和json之间的互相转化
  5. 10的预览模式_谷歌相机2020年3月更新汇总,适配米10等五摄手机,30s手动曝光
  6. mysql update用not in太慢了_MySQL 加锁和死锁解析
  7. 由java的八个基本数据类型说开去
  8. 微信开发 :WeixinPayInfoCollection尚未注册Mch 问题解决
  9. git忽略文件【转】
  10. linux面试题中的简答题,[计算机]linux面试题简答题部分.doc
  11. 部署虚拟环境安装Linux系统(Linux就该这么学)笔记
  12. “The server requested authentication method unknown to the client.”的解决方案
  13. MATLAB学习笔记(十八)
  14. [转载] 跟着吴恩达学机器学习(Machine Learning) on Coursera 第一天
  15. 2015年江苏省计算机c语言二级考试,2015江苏省计算机等级考试C语言部分试题.doc...
  16. Ubuntu 截屏(或截图)
  17. 易基因 | 转录组测序在原核生物研究中的应用(4)| 文献科普
  18. 今晚7:00 | PhD Debate 自监督学习在推荐系统中的应用
  19. uniapp开发小程序如何修改picker选中样式及选中字体样式
  20. 【随笔】Inconsolata字体的下载安装及在VS2017中使用该字体

热门文章

  1. DAIC:针对BEC欺诈的开源利器
  2. JavaScript初学者编程题(17)
  3. mysql截取不含%_zp blog
  4. 关于学习Python的一点学习总结(20->assert判断->while和for使用)
  5. Himmelblau函数优化实战
  6. 李超线段树(Li-Chao Segment Tree)
  7. szu 寒训第二天 树状数组 二维树状数组详解,以及树状数组扩展应用【求逆序对,以及动态第k小数】
  8. UVA1626 括号序列 Brackets sequence(区间DP匹配括号,输出匹配方案)
  9. 图片右击打印不弹出打印首选项
  10. 字母组成美丽的图形 c语言,[原创]美丽蝴蝶