mysql-数据页结构

2023-11-06

数据页结构

·数据删除后记录并没有马上被删除,而是被打上了删除标记,并被记录到一个垃圾链表中,之后若有新纪录来,它们则可能覆盖被删除的记录占用的存储空间。

·页内数据组成单向链表,且再次进行了分组,每组最后一条数据顺序存储在靠近页尾部的地方,这种数据称为,页目录就是多个槽组成的。

·页内数据单向链表,页与页之间双向链表。

索引

·二级索引携带主键信息到聚簇索引重新定位完整记录的过程称为回表

·二级索引记录的内容由三部分组成: ·索引列的值   ·主键值    ·页号

表空间

·表空间被划分为许多连续的,对于16KB的页来说,连续的64个页就是一个区,也就是说一个区默认1MB。每256个区又被划分为一个

·一个索引会生成2个,一个叶子节点段和一个非叶子节点段。

表连接的原理

·两个表的连接查询中,驱动表只需要访问一次,被驱动表可能需要访问多次。

成本优化

·读取一个页面花费成本默认1.0;读取及检测一条索引是否符合搜索条件的成本默认是0.2。这些称之为成本常数。

·在真正执行一条单表查询语句前,优化器会找出所有可以用来执行该语句的方案,并对比后找出成本最低的方案。

·查询成本 = I/O成本 + CPU成本

计算全表扫描的代价:

·聚簇索引占用的页面数         

 ·该表中的记录数

通过show table status语句查询表的统计信息。

rows:表中的记录数,myisam是准确值,innodb是一个估值。

data_length:表占用的存储空间的字节数。  data_length = 聚簇索引的页面数量 X 每个页面的大小,默认页面大小为16KB。

假如一个表rows为9693; 假如data_length为1589248,则页面数量 = 1589248 / 16 /1024 = 97 。

则I/O成本:97*1.0+1.1 =98.1           CPU成本:9693*0.2+1.0 =1939.6      总成本 98.1+1939.6=2037.7

·多条索引的时候,查询优化器先分析使用唯一二级索引的成本。

使用二级索引+回表方式执行的查询

计算查询成本的时候依赖两方面数据:扫描区间数量+需要回表的记录数。

·扫描区间数量:读取一个扫描区间的I/O成本与读取一个页面的I/O成本相同。

·回表记录数:就是上述扫描区间中能扫描出来的二级索引的记录数。

比如有一个扫描区间(10,1000),计算过程:先找到>10的第一条记录,再找到满足<1000的最后一条记录,如果这2条记录相隔不远(不大于10个页面),则能精确计算出满足的条数,如果超过10个页面,则只沿着最左记录向右读取10个页面,计算平均一个页面有多少记录,然后乘以页面数量预估有多少记录。(要预估最左最右隔着多少页面,需要查找上一级索引看他们对应的索引页隔着多少记录即可)

·找到了这些记录条数还需要回表,默认以为回表操作相当于访问一个页面,所以有多少记录,就要回多少次表。

·回表找到完整记录后,还需要检测其他搜索条件是否成立。

所以总成本:I/O成本: 1.0+95*1.0=96.0(扫描区间数量 + 预估的二级索引记录数(也就是回表记录数))      CPU成本:95*0.2+0.01+95*0.2=38.01(读取二级索引的成本+回表后检测其他条件是否成立的成本)

对应in操作,比如in (0,100,1000)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql-数据页结构 的相关文章

  • PDO::commit() 成功或失败

    The PHP PDO 提交 http www php net manual en pdo commit php文档指出该方法成功时返回 TRUE 失败时返回 FALSE 这是指beginTransaction 和commit 之间的语句执
  • 更新重复密钥上的复合密钥 [重复]

    这个问题在这里已经有答案了 我需要更新新行 如果两者都满足 date dat and empId who 作为复合键 但如果其中之一或两者不同 则插入 sql INSERT INTO history SET endtimestamp now
  • 使用MySQL计算单个表中借方和贷方的余额

    下面的 MySQL 表包含带有关联金额的借方或贷方 操作 如何选择具有非零 余额 的所有 CLIENT ID 我尝试将表连接到自身以计算所有借方和贷方总额 但有些东西无法正常工作 CLIENT ID ACTION TYPE ACTION A
  • PHP 的 PDO 可以限制为单个查询吗?

    PHP 的 PDO 允许通过 query 方法或作为准备好的语句同时执行多个查询 以下两个示例均有效 Two SQL queries query SELECT FROM table DROP table Execute via query
  • 从 PDO 准备好的语句中获取原始 SQL 查询字符串

    在准备好的语句上调用 PDOStatement execute 时 有没有办法让原始 SQL 字符串执行 出于调试目的 这将非常有用 我假设您的意思是您想要最终的 SQL 查询 并将参数值插入其中 我知道这对于调试很有用 但这不是准备好的语
  • SQL Server 相当于 MySQL 的 USING

    在 MySQL 中 当您连接不同表中具有相同名称的列时 可以在连接中使用关键字 USING 例如 这些查询产生相同的结果 SELECT FROM user INNER JOIN perm USING uid SELECT FROM user
  • 数据表 - 服务器端处理 - 数据库列合并

    我目前正在使用 DataTables 1 10 5 服务器端处理功能 http www datatables net examples data sources server side html http www datatables ne
  • Laravel Group By 和 Order By 不起作用

    我尝试制作一个Laravel 5 8项目 项目中的数据是这样的 id purch name prcvalue 1 10234 Nabila 100 2 10234 Nadeera 450 3 10234 Nabila 540 4 10234
  • 哪个是识别关系或非识别关系中的子表?

    在表之间的识别和非识别关系的上下文中 MySQL 文档大量将表称为父表和子表 如何判断哪个表是父表 哪个表是子表 子表 A K A 弱实体 http en wikipedia org wiki Weak entity 是一个表 其主键属性d
  • MySql 从另一个表中减去一个表

    我有两个表 A 包含所有数据 表 B 从 A 中随机选择 25 的数据创建 所以 A 和 B 具有完全相同的列 也没有独特的列 我想做的是从 A 中减去 B 有什么想法吗 查看所有行A除了那些在B SELECT FROM A WHERE f
  • 将此 MySQL 查询转换为 PyGreSQL

    我正在开发一个 Ruby 应用程序 它使用 mysql 函数 XOR 和 BIT COUNT 不过 我现在需要在运行 PyGreSQL 的 Heroku 上运行该应用程序 我找不到任何可以帮助我的 PyGreSQL 文档 那么任何人都可以翻
  • 如何编写 bash 函数来包装另一个命令?

    我正在尝试编写一个函数包装器mysql command If my cnf存在于 pwd 中 我想自动附加 defaults file my cnf到命令 这就是我正在尝试的 function mysql if e my cnf then
  • MySQL 中非空值的计数和分组

    我需要计算按特定 ID 分组的非空 我的意思是至少包含 1 个字符的字符串 行 例如 我的数据可能如下所示 form id mapping 1 value 1 1 1 value 2 2 2 NULL 3 value 3 我想计算每个表单的
  • 创建rest api url以连接mysql数据库

    我想学习如何创建一个rest api url 以便我可以使用该url获取信息并将信息发布到我的mysql数据库中 谷歌搜索了很多并阅读了各种文章 但没有找到任何精确的内容可以学习 所有内容均以 about api 开头 以已创建的其余 ur
  • MySQL:空间查询查找纬度/经度点是否位于给定边界内

    我正在研究谷歌地图搜索功能 其目的是找出 地理位置 点是否位于多边形内 如下图所示 我使用带有 Spatial 扩展的 mysql 5 6 20 我知道它内置有用的几何函数 因此我可以直接从数据库查询地理编码位置 我的目的是熟悉地理空间函数
  • 有没有办法只安装mysql客户端(Linux)? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有没有不需要安装整个mysql db安装包的Linux mysql命令行工具 我想做的是从服务器 1 应用程序服务器 执行将在服务器 2
  • 将java应用程序与在线托管的mysql数据库连接

    我已经用java构建了一个应用程序 应用程序是一个 将在3个不同的系统上使用 因此 该应用程序的数据库必须在线 以使所有 3 个应用程序都具有最新的数据库 In starting I developed my application bas
  • VB.NET 和 MySql UPDATE 查询

    我的代码在这里没有错误 至少在我调试它时没有错误 我使用VS 2010 但我希望发生的是 当我单击添加按钮时 文本框 txtQty 中的数字将添加到当前保存在 数量 列中的数字中 例如 txtQty 100 该列上的当前值为 200 我想将
  • 插入 Mysql 表时防止 Json 排序

    在发送 AJAX 请求时 Json Content 的重新排序已经是一个已知问题 但我不知道在将 Json content 插入 JSON 类型的 Mysql 表时也会发生同样的情况 在这种情况下 mysql 服务器在保存之前也会对其内容进
  • 如何启用对 MySQL 服务器的外部访问? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 如何启用对 MySQL 服务器的外部访问 我可以在本地连接 但无法从网络上的另一个盒子进行连接 我刚刚尝试过 grant all privileges

随机推荐

  • 鸿蒙笔记2

    常用基础组件 1 组件介绍 组件 Component 是界面搭建与显示的最小单位 HarmonyOS ArkUI声明式开发范式为开发者提供了丰富多样的UI组件 我们可以使用这些组件轻松的编写出更加丰富 漂亮的界面 组件根据功能可以分为以下五
  • MongoDB数据库常用SQL命令

    1 db collection updateMany 修改集合中的多个文档 db getCollection user find pId 3332a512df604a74a72f267cf246 updateMany pId c8018dd
  • ES6 数组的扩展方法

    1 数组的方法 from of from 将伪数组转换成真正的数组 function add console log arguments es5中 将参数转换成数组 let arr slice call arguments console
  • 时间序列--残差分析

    残差 y yhat 一般我们就停止在这里了 但是如果残差表现的有某种形式 代表我们的模型需要进一步改进 如果残差表现的杂乱无章 代表确实没什么别的信息好提取了 现在用最naive的model 上一个时间的值 yhat看看残差表现吧 关于残差
  • 初识QT(二十)——Qt元对象和属性系统详解

    Qt 是一个用标准 C 编写的跨平台开发类库 它对标准 C 进行了扩展 引入了元对象系统 信号与槽 属性等特性 使应用程序的开发变得更高效 本节将介绍 Qt 的这些核心特点 对于理解和编写高效的 Qt C 程序是大有帮助的 Qt 的元对象系
  • http协议 git服务器,利用Nginx搭建HTTP访问的Git服务器

    利用Nginx搭建HTTP访问的Git服务器过程记录 搭建 Git 仓库 实现 SSH 协议 配合 Nginx 实现 HTTP 协议拉取 推送代码 利用 Nginx 实现 Gitweb 在线浏览代码 使用 Gitweb theme 更新默认
  • Super Egg Drop

    题目 出处 参考的解法 class Solution public int superEggDrop int K int N int memo new int K 1 N 1 return helper K N memo private i
  • 在javascript中,slice与splice的区别

    介绍 众所周知 Javascript中的数组是能够保存多个值的变量 我们有多种方法来处理数组 其中最常用的是 slice 和 splice 有时人们会混淆这两者 因此 在本博客中 我们将了解这两种方法以及它们之间的区别 Slice slic
  • Linux网络编程-客户端与服务器端通信

    Linux网络编程 客户端连接服务器端让我们已经看到了client与server之间是如何建立连接的 接下来介绍它们之间如何建立tcp协议交互通信 先看看服务器端代码 tcpserver c include
  • 15个经典面试问题及回答思路,知乎上转疯了!

    一 简介 Handler机制是一套Android消息传递机制 在Android开发多线程的应用场景中 将工作线程中需更新UI的操作信息 传递到 UI主线程 从而实现 工作线程对UI的更新处理 最终实现异步消息的处理 在Android开发中
  • Linux 初始组(主组)和附加组详解

    Linux 初始组 主组 和附加组详解 介绍 在Linux系统中 每个用户都有一个主组和多个附加组 初始组 主组 是用户创建后默认分配的组 而附加组则可以根据需要进行添加或删除 本文将介绍Linux系统中初始组 主组 和附加组的方法 并探讨
  • tar.xz文件如何解压

    创建或解压tar xz文件的方法 习惯了 tar czvf 或 tar xzvf 的人可能碰到 tar xz也会想用单一命令搞定解压或压缩 其实不行 tar里面没有征对xz格式的参数比如 z是针对 gzip j是针对 bzip2 创建tar
  • vue el-table 树形数据懒加载每次点击子集父级只展示一行

    功能需求 每次只打开一个同级数据节点展开 之前展开的自动收起 ps 找了好久都没有找到完全符合需求的组件 展示效果 vue el table 数据懒加载实现每次子集只展示一行 实现代码 模板 使用load配合expand change使用
  • IDEA创建SpringBoot无法连接https://start.spring.io

    解决办法 将网址改成 http start spring io
  • 小白学股票基金_4_ETF

    ETF Exchange Traded Funds 中文名称为交易型开放式指数基金 是一种在交易所上市交易的开放式指数基金 兼具股票 开放式指数基金及封闭式指数基金的优势 属于高效的指数化投资工具 也就是说 如果我们买一手科技ETF 就可以
  • Intellij IDEA使用技巧,去掉拼写检查和unused提示

    在setting里面搜索spell将其中的拼写检查的 号去掉 搜索never used 关键字将其中的unused的检查去掉
  • 模块化软件设计

    模块化的基本原理 模块化 Modularity 是在软件系统设计时保持系统内各部分相对独立 以便每一个部分可以被独立地进行设计和开发 这个做法背后的基本原理是关注点的分离 SoC Separation of Concerns 关注点的分离在
  • 第5天-[21天学Python]-Python中自定义函数及调用的方法

    本章内容主要包括 声明函数 调用自定义函数 变量作用域 各种类型的函数参数应用 使用lambda建立匿名函数 Python其他常用内建函数 1 使用函数 1 1 声明函数 在python中 函数必须先声明 然后才能调用它 使用函数时 只要按
  • Multisim14.0仿真(八)LM555制作流水灯

    一 仿真原理图 二 仿真运行效果
  • mysql-数据页结构

    数据页结构 数据删除后记录并没有马上被删除 而是被打上了删除标记 并被记录到一个垃圾链表中 之后若有新纪录来 它们则可能覆盖被删除的记录占用的存储空间 页内数据组成单向链表 且再次进行了分组 每组最后一条数据顺序存储在靠近页尾部的地方 这种