SQL进阶理论篇(八):SQL查询的IO成本

文章目录

  • 简介
  • 数据库缓冲池
  • 查看缓冲池的大小
  • 数据页加载的三种方式
  • 通过 last_query_cost 统计 SQL 语句的查询成本
  • 总结
  • 参考文献

简介

本节将介绍磁盘IO是如何加载数据的,重点介绍一下数据库缓冲池的概念。主要包括:

  • 什么是数据库缓冲池,它在数据库中扮演了什么角色?
  • 对数据页进行加载的几种方式
  • 如何统计一条SQL语句中,需要在缓冲池中进行加载的页的数量。

数据库缓冲池

为了能够让数据表或者索引中的数据随时为我们所用,DBMS会申请一块内存来作为数据缓冲池。

数据缓冲池里会保存经常使用的数据,这样的话,当数据库进行页面读的时候,会首先来寻找该页面是否在缓冲池里,如果存在就直接读取,如果不存在,就会通过磁盘或者内存,将页面放进缓冲池里再进行读取。

缓冲池在数据库中的结构和作用如下图:

在这里插入图片描述

如果我们执行了类似update语句,改变了缓冲池里的数据,那么这些数据会立即同步到磁盘上吗?

当然不是。

实际上,当我们修改数据库中的记录时,首先会修改缓冲池中页的记录信息,然后数据库会以一定的频率将新的数据刷新回磁盘。所以不是每次发生更新操作 ,都会立即回写的。

比如说,当缓冲池空间不够用的时候,就需要释放掉一些不常用的页,这时候就会强行将这些页的数据回写到磁盘,然后在缓冲池里将这些页释放掉。

这里面有一个脏页(dirty Page)的概念,是指在缓冲池里被修改过,尚未回写,因此与磁盘上不同的数据页。

查看缓冲池的大小

如果使用的是MySQL的MyISAM引擎,其只缓存索引,不缓存数据,对应的键缓存参数为key_buffer_size,可以通过查看这个变量来查看缓冲池大小。

如果使用的是InnoDB引擎,则可以通过以下命令查看:

mysql > show variables like 'innodb_buffer_pool_size'

在这里插入图片描述

单位是B,转换成MB就是8MB。

如果想修改缓冲池大小为128MB,则可以通过:

set global innodb_buffer_pool_size = 134217728;

在InnoDB中,我们还可以同时开启多个缓冲池。

可以通过以下命令查看当前缓冲池的数量:

mysql > show variables like 'innodb_buffer_pool_instances'

默认情况下,其实是会有8个缓冲池,但是如果你的innodb_buffer_pool_size参数小于1G,那刚才的命令只会显示出1个缓冲池。

数据页加载的三种方式

如果缓冲池中没有我们想要的数据页,那么缓冲池有三种方式,可以将指定数据页加载进缓冲池,每种方式的读取效率会有不同。

  • 内存读取

如果该数据页是在内存里,那么直接读进缓冲池,效率还是很高的。

在这里插入图片描述

  • 随机读取

如果数据没有在内存里,那就是在磁盘里,因此我们需要在磁盘上对该页进行查找,假设整体时间是10ms,这 10ms 中有 6ms 是磁盘的实际繁忙时间(包括了寻道和半圈旋转时间),有 3ms 是对可能发生的排队时间的估计值,另外还有 1ms 的传输时间,将页从磁盘服务器缓冲区传输到数据库缓冲区中。

以上过程结束之后,我们才算完成了一页的读取,多页读取的话,时间会继续拉长。

在这里插入图片描述

  • 顺序读取

顺序读取其实是一种批量读取的方式,因为我们请求的数据在磁盘上往往都是相邻存储的,顺序读取可以帮我们批量读取页面,这样的话,一次性加载到缓冲池中就不需要再对其他页面单独进行磁盘 I/O 操作了。

采用批量读取的方式,即使是从磁盘上进行读取,平均一页的读取效率也比从内存中单独读取一个页的效率要高。

通过 last_query_cost 统计 SQL 语句的查询成本

如果我们想要查看某条 SQL 语句的查询成本,可以在执行完这条 SQL 语句之后,通过查看当前会话中的 last_query_cost 变量值来得到当前查询的成本。这个查询成本对应的是 SQL 语句所需要读取的页的数量。

比如说,我们直接在聚集索引上查找一条指定记录:

mysql> SELECT comment_id, product_id, comment_text, user_id FROM product_comment WHERE comment_id = 900001;

运行结果只有一条,运行时间为 0.042s。

然后再看下查询优化器的成本,执行以下代码:

mysql> SHOW STATUS LIKE 'last_query_cost';

在这里插入图片描述

可以看到,我们只检索了一页。

那我们把查询搞复杂点,比如说查询 comment_id 在 900001 到 9000100 之间的评论记录呢?

mysql> SELECT comment_id, product_id, comment_text, user_id FROM product_comment WHERE comment_id BETWEEN 900001 AND 900100;

运行结果有100条记录,运行时间为 0.046s。

执行以下代码,查看查询优化器的成本:

mysql> SHOW STATUS LIKE 'last_query_cost';

在这里插入图片描述

可以看到我们大概进行了20个页的读取。

虽然读取的页变多了,但是两条SQL的查询时间基本一致。这是因为后台通过顺序读取,将页面一次性加载到了缓冲池里,然后再进行查找。所以虽然页数量增加了不少,但其实并没有消耗太多时间。

总结

注意,缓冲池跟我们在之前章里提过的查询缓存又不一样。

查询缓存服务的是查询结果集,它是指把查询结果缓存起来,这样下次遇到相同的查询就可以直接拿到结果。注意是相同查询才行,所以这种机制的查询缓存其实命中率不高,在MySQL8.0版本中已经弃用了查询缓存的功能。

而缓冲池是服务于数据库整体的IO操作,通过建立缓冲池来弥补磁盘文件和内存之间的速度鸿沟,从而提高整体的IO效率。

参考文献

  1. 28丨从磁盘I/O的角度理解SQL查询的成本

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/251265.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云架构俭约之道七法则(The Frugal Architect)

授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 亚马逊云科技开发者社区, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道 文章目录 一、前言关于 Law 与 Rule 的区别 二、云架构俭约之道七法…

【算法刷题】每日打卡——动态规划(1)

背包问题 例题一 有 N件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i件物品的体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。 输入格式 第一行两个整数…

深度学习python编译器的配置及法宝函数的作用

一、python编辑器的配置(pycharm 和 jupyter) (1)pycharm 在pycharm导入conda环境: 新建项目,更改编译器,选择已有的编译器 选择python.exe时会出现错误:找不到conda可执行文件 …

太空旅行:计算机技术的崭新航程

太空旅行:计算机技术的崭新航程 一、引言 自古以来,人类就对浩渺的宇宙充满了无尽的好奇和渴望。随着科技的飞速发展,太空旅行已经从科幻小说中的构想变为现实。在这个过程中,计算机技术起到了不可或缺的作用。从阿波罗时代的初…

EDT:On Efficient Transformer-Based Image Pre-training for Low-Level Vision

EDT:On Efficient Transformer-Based Image Pre-training for Low-Level Vision 论文地址:On Efficient Transformer-Based Image Pre-training for Low-Level Vision 代码地址:fenglinglwb/EDT: On Efficient Transformer-Based Image Pre…

知识付费小程序开发:技术实践示例

随着知识付费小程序的兴起,让我们一起来看一个简单的示例,使用Node.js和Express框架搭建一个基础的知识付费小程序后端。 首先,确保你已经安装了Node.js和npm。接下来,创建一个新的项目文件夹,然后通过以下步骤创建你…

LabVIEW实时建模检测癌细胞的异常

LabVIEW实时建模检测癌细胞的异常 癌症是全球健康的主要挑战之一,每年导致许多人死亡。世界卫生组织指出,不健康的生活方式和日益严重的环境污染是癌症发生的主要原因之一。癌症的发生通常与基因突变有关,这些突变导致细胞失去正常的增长和分…

excel手撕神经网络(只需高中数学基础)

神经网络最基础部分是由神经元组成,一个神经元相当于是一个一次函数,yaxb 即在已知x,和y情况下,怎么使用神经网络求解a和b 如下是使用excel求解的神经网络,可以方便理解神经网络运行原理 excel玩具神经网络下载地址 百…

蓝桥杯专题-真题版含答案-【排序法 - 改良的选择排序】【插补搜寻法】【稀疏矩阵】【欧拉与鸡蛋】

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分…

centos8stream 升级 sqlite3 ,解决 SQLite 3.27 or later is required (found 3.26.0).

服务器环境是centos8stream, 默认的sqlite是 3.26 ,因此,需要升级。 sqlite官网:SQLite Download Page 1.从官网下载最新源码包 cd /opt/ wget https://www.sqlite.org/2023/sqlite-autoconf-3440200.tar.gz tar xvf sqlite-autoconf-344020…

【webstrom】【idea】修改git历史提交记录

webstrom修改git历史提交记录 历史记录中有3条提交记录 此时2中的提交记录需要更新,我们可以在2中右击,选择“从这里执行交互式变基” 在弹框中选择需要修改提交记录2右击,然后选择“停止以编辑” 启动变基 更改2中内容 提交对2的更改 …

机器学习 高维数据可视化:t-SNE 降维算法

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…

Flink中的时间和窗口

在批处理统计中,我们可以等待一批数据都到齐后,统一处理。但是在实时处理统计中,我们是来一条就得处理一条,那么我们怎么统计最近一段时间内的数据呢?引入“窗口”。 所谓的“窗口”,一般就是划定的一段时…

CentOS 7系统加固详细方案SSH FTP MYSQL加固

一、删除后门账户 修改强口令 1、修改改密码长度需要编译login.defs文件 vi /etc/login.defs PASS_MIN_LEN 82、注释掉不需要的用户和用户组 或者 检查是否存在除root之外UID为0的用户 使用如下代码,对passwd文件进行检索: awk -F : ($30){print $1) …

(C++)VS下sizeof(string(““))与linux-g++下sizeof(string(““))大小区别及原因剖析

个人主页:Lei宝啊 愿所有美好如期而遇 说明 博主是x86平台,所以下面的结果是28;x64平台下是40,size_t变了,由int变long long。 接下来我们先来介绍 vs 下string的数据结构 我们可以看到有一个_Buf数组,…

极坐标下的牛拉法潮流计算57节点MATLAB程序

微❤关注“电气仔推送”获得资料(专享优惠) 潮流计算: 潮流计算是根据给定的电网结构、参数和发电机、负荷等元件的运行条件,确定电力系统各部分稳态运行状态参数的计算。通常给定的运行条件有系统中各电源和负荷点的功率、枢纽…

大模型时代-大模型开发入门

一、 学习大模型的入门知识 深度学习基础知识:了解深度学习中的基本概念、算法和模型,包括神经网络、卷积神经网络、循环神经网络等。 编程能力:掌握至少一种编程语言,如Python、C等,熟悉常用的深度学习框架&#xff…

解锁数据探索新时代,JetBrains DataGrip 2023 Mac/win中文版下载

JetBrains DataGrip 2023 Mac/win,作为一款全新的数据库管理和开发工具,为数据工程师、分析师和开发人员提供了强大的功能和工具,帮助他们更高效地处理和分析数据。无论你是使用Mac还是Windows系统,都能够通过这款软件轻松驾驭数据…

【halcon深度学习】目标检测的数据准备过程中的一个库函数determine_dl_model_detection_param

determine_dl_model_detection_param “determine_dl_model_detection_param” 直译为 “确定深度学习模型检测参数”。 这个过程会自动针对给定数据集估算模型的某些高级参数,强烈建议使用这一过程来优化训练和推断性能。 过程签名 determine_dl_model_detection…

【JAVA日志框架】JUL,JDK原生日志框架详解。

前言 Java日志体系混乱?Java日志框架系列,清晰简洁整理好整个Java的日志框架体系。第一篇,JDK原生日志框架——JUL。 目录 1.概述 2.日志级别 3.配置 4.继承关系 1.概述 日志框架的核心问题: 日志是用来记录应用的一些运行…
最新文章