SQL查询效率以及索引设计

news2025/5/30 14:55:49

1. SQL 查询效率与数据库缓冲池机制

1.1. 数据库缓冲池(Buffer Pool)

磁盘 I/O 需要消耗的时间很多,而在内存中进行操作,效率则会高很多,为了能让数据表或者索引中的数据随时被我们所用,DBMS 会申请占用内存来作为数据缓冲池,这样做的好处是可以让磁盘活动最小化,从而减少与磁盘直接进行 I/O 的时间。

缓冲池的工作原理:

1. 数据库读取页时,先检查缓冲池是否有该页。

  • 有 → 直接读取。
  • 没有 → 从磁盘读取到缓冲池,再读取。

2. 对数据库中的记录进行修改:

修改数据时,先修改缓冲池中的页,然后延迟刷新到磁盘。

当我们对数据库中的记录进行修改的时候,首先会修改缓冲池中页里面的记录信息,然后数据库会以一定的频率刷新到磁盘上。注意并不是每次发生更新操作,都会立刻进行磁盘回写。缓冲池会采用一种叫做 checkpoint 的机制将数据回写到磁盘上,这样做的好处就是提升了数据库的整体性能

3. 使用 checkpoint 机制 将“脏页(dirty page)”回写到磁盘:

  • 脏页:缓冲池中已修改但尚未同步到磁盘的页。
  • 回写时机:缓冲池不够用时、定时、事务提交等。

1.2. 查看缓冲池信息

1. 不同引擎的缓冲机制

  • MyISAM 引擎:

只缓存索引,不缓存数据。

参数:key_buffer_size

  • InnoDB 引擎:

缓存索引和数据。

参数:innodb_buffer_pool_size

2. 查看/设置缓冲池大小

查看:

SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
  • 示例:8388608 bytes = 8MB

修改:

SET GLOBAL innodb_buffer_pool_size = 134217728;  -- 设置为128MB

3. 查看缓冲池实例数量

SHOW VARIABLES LIKE 'innodb_buffer_pool_instances';
  • 默认值为 8,但当 innodb_buffer_pool_size < 1GB 时,实例数量强制为 1。
  • 多个实例需要将缓冲池大小设置为 ≥ 1GB。

1.3. 数据页的三种加载方式

1. 内存读取

数据已存在内存中。

时间:≈1ms,效率最高。

1. 随机读取(磁盘)

数据不在内存中,从磁盘上随机读取页。

时间:≈10ms(包括寻道、旋转、排队、传输等)

效率较低。

2. 顺序读取(磁盘)

数据页在磁盘上相邻,采用批量加载方式。

时间:≈0.4ms/页(以40MB/s磁盘吞吐量计算)

效率可超过内存中的单页随机读取。

SQL 查询是一个动态的过程,从页加载的角度来看,可以得到以下两点结论:

3. 位置决定效率

页在内存(缓冲池)中 → 查询效率最高。

页在磁盘中 → 查询需耗时进行 I/O 操作。

4. 批量决定效率

单页随机读效率低。

顺序读取 + 批量加载 → 平均读页效率更高。

2. 设计索引

2.1. 索引片和过滤因子

  • 索引片:SQL 查询中需要扫描的索引片段,根据包含的匹配列数,索引可以分为窄索引(1~2列)和宽索引(3列及以上)。

窄索引:减少索引访问开销。

宽索引:扫描更多的索引页,但可避免回表操作,提升查询效率。

  • 回表:回表是通过索引查找到记录后,还需要使用主键再次查询数据表。宽索引可以避免这种回表操作。
  • 过滤因子:描述谓词选择性的指标,衡量索引的筛选能力。过滤因子越高,满足条件的记录数越少,查询时扫描的索引片也就越小。

不好的过滤因子:例如,gender='male'(所有球员都是男性),team_id=1001(数据集中特定比例过高)。

好的过滤因子:例如,height=2.08,通过组合多个字段形成联合过滤因子,能更高效筛选记录。

2.2. 如何设计索引

三星索引

一种理想的索引设计方法,旨在提高SQL查询效率,遵循以下三条原则:

  1. 在 WHERE 子句中的等值谓词条件列添加到索引片中。
  2. 将 GROUP BY 和 ORDER BY 中的列也加入到索引中,以避免 file sort
  3. 将 SELECT 字段中的剩余列添加到索引片中,避免回表。

为什么理想的索引设计难以应用

  • 索引宽度问题:三星索引会使索引片变宽,增加了页加载的数量,可能增加磁盘I/O操作。如果数据量巨大,索引可能占用大量空间,增加缓冲池的负担。
  • 索引维护成本:过多的索引增加了插入、更新、删除操作的成本。每次修改数据时,需要更新所有相关索引,这可能导致性能下降。
    • 举个例子:假设添加一条记录需要在10个索引中更新,时间消耗可能达到0.1秒。

设计索引的最佳实践

  • 索引个数:一张表的索引数量不宜过多,过多的索引会增加插入、更新和删除的成本。需要定期检查索引的使用情况,删除不常用的索引。
  • 复合索引:当需要新建索引时,可以考虑在已有的索引基础上增加字段,采用复合索引而不是新建单独索引。
  • 索引列数量:尽量将 WHERE 条件中的列加入索引中,SELECT 中的非条件列一般不需要加入索引,除非这些列常常被查询。
  • 单列索引与复合索引长度控制

MySQL InnoDB 默认索引长度最大为 767 字节,超过此限制会采用前缀索引。

字符类型字段的索引:字符类型字段占用较多空间,建议用数值类型代替字符类型做主键,字符字段做前缀索引。

总结

  • 理想索引:三星索引是一种理想的索引设计方案,但实际应用中需要考虑索引的宽度、索引维护成本等因素,过多索引会增加系统负担。
  • 权衡:在设计索引时,需要在查询效率和索引维护成本之间做出平衡,避免过多的宽索引导致性能瓶颈。
  • 复合索引和单列索引:当有多个条件时,使用复合索引来减少扫描的索引片,提升查询效率。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

day37打卡

知识点回顾&#xff1a;浙大疏锦行 过拟合的判断&#xff1a;测试集和训练集同步打印指标模型的保存和加载 仅保存权重保存权重和模型保存全部信息checkpoint&#xff0c;还包含训练状态 早停策略 作业&#xff1a;对信贷数据集训练后保存权重&#xff0c;加载权重后继续训练50…

分布式缓存:证明分布式系统的 CAP 理论

文章目录 Pre一、分布式系统背景与特点二、CAP 三要素详解三、CAP 定理的反证证明四、CP 架构与 AP 架构对比典型场景 五、CAP 理论在系统设计中的应用六、总结 Pre 分布式缓存&#xff1a;CAP 理论在实践中的误区与思考 分布式缓存&#xff1a;BASE理论实践指南 分布式 - 从…

软件设计师“面向对象设计”真题考点分析——求三连

一、考点分值占比与趋势分析 综合知识历年考察统计 年份考题数分值占比考察重点2018334%继承类型、设计原则2019445.3%多态实现、类关系2020556.7%设计模式应用、接口隔离2021334%消息通信、封装特性2022668%开闭原则、组合模式2023556.7%模板方法、适配器模式2024445.3%单一…

AI大模型学习二十八、ACE-Step:生成式AI音乐大模型简介与安装(一)

一、说明 先来一首创作的歌&#xff1a; 在大模型和生成式AI模型大规模发达的今天&#xff0c;利用大模型生成音乐也是其中一个重要的发展方向。今天我们就介绍一个这样的音乐生成模型ACE-Step&#xff0c;可基于关键字和歌词生成歌曲&#xff1b;基于歌曲生成伴奏等等功能。 …

接口性能测试-工具JMeter的学习

接口登录链接http://111.230.19.204:8080/blog_login.html 一、JMeter基本使用流程 1、启动Jmeter 2、在“测试计划”下添加线程组 3、在“线程组”下添加“HTTP”取样器 4、填写“HTTP请求”的相关请求数据 5、在“线程组”下添加“查看结果树”监听器 6、点击“启动”按钮…

python如何离线安装pandas,numpy

1.首先在有网的电脑上正常安装python&#xff08;和离线环境一样的版本&#xff09; 然后 pip install pandas &#xff08;不嫌麻烦的话也可以自己手动去pandas PyPI​​​​​​​ 一个个下载&#xff09; 安装好后导出相关包&#xff0c;使用如下指令 2.然后相关依赖包就…

Java Swing 自定义JOptionPane

运行后的样式 import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;public class demoB {public static void main(String[] args) {SwingUtilities.invokeLater(() -> {JFrame jf new JFrameDemo();jf.se…

【图像大模型】Stable Diffusion XL:下一代文本到图像生成模型的技术突破与实践指南

Stable Diffusion XL&#xff1a;下一代文本到图像生成模型的技术突破与实践指南 一、架构设计与技术演进1.1 核心架构革新1.2 关键技术突破1.2.1 双文本编码器融合1.2.2 动态扩散调度 二、系统架构解析2.1 完整生成流程2.2 性能指标对比 三、实战部署指南3.1 环境配置3.2 基础…

C 语言指针之手写内存深度剖析与手写库函数:带你从0开始手撸库 附录1.5 万字实战笔记

一、指针入门&#xff1a;从野指针到空指针 1.1 野指针的第一次暴击&#xff1a;沃日 哪里来的Segmentation Fault &#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f; 刚学指针时写过一段让我及其楠甭的代码,我x了xx的&#xff0c;最后才发现是为…

C#高级:Winform桌面开发中CheckedListBox的详解

一、基础设置 单击触发选择效果&#xff1a;需要选择下面这个为True 二、代码实现 1.设置数据源 /// <summary> /// 为CheckBoxList设置数据源 /// </summary> /// <param name"checkedListBox1"></param> /// <param name"data&…

AI学习笔记二十八:使用ESP32 CAM和YOLOV5实现目标检测

若该文为原创文章&#xff0c;转载请注明原文出处。 最近在研究使用APP如何显示ESP32 CAM的摄像头数据&#xff0c;看到有人实现把ESP32 CAM的数据流上传&#xff0c;通过YOLOV5来检测&#xff0c;实现拉流推理&#xff0c;这里复现一下。 一、环境 arduino配置esp32-cam开发环…

免费分享50本web全栈学习电子书

最近搞到一套非常不错的 Web 全栈电子书合集&#xff0c;整整 50 本&#xff0c;都是epub电子书格式&#xff0c;相当赞&#xff01;作为一个被期末大作业和项目 ddl 追着跑的大学生&#xff0c;这套书真的救我狗命&#xff01; 刚接触 Web 开发的时候&#xff0c;我天天对着空…

【prometheus+Grafana篇】基于Prometheus+Grafana实现MySQL数据库的监控与可视化

&#x1f4ab;《博主主页》&#xff1a; &#x1f50e; CSDN主页 &#x1f50e; IF Club社区主页 &#x1f525;《擅长领域》&#xff1a;擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控&#xff1b;并对SQLserver、NoSQL(MongoDB)有了…

全链路解析:影刀RPA+Coze API自动化工作流实战指南

在数字化转型加速的今天&#xff0c;如何通过RPA与API的深度融合实现业务自动化提效&#xff0c;已成为企业降本增效的核心命题。本文以「影刀RPA」与「Coze API」的深度协作为例&#xff0c;系统性拆解从授权配置、数据交互到批量执行的完整技术链路&#xff0c;助你快速掌握跨…

高阶数据结构——哈希表的实现

目录 1.概念引入 2.哈希的概念&#xff1a; 2.1 什么叫映射&#xff1f; 2.2 直接定址法 2.3 哈希冲突&#xff08;哈希碰撞&#xff09; 2.4 负载因子 2.5 哈希函数 2.5.1 除法散列法&#xff08;除留余数法&#xff09; 2.5.2 乘法散列法&#xff08;了解&#xff09…

2025 年网络安全趋势报告

一、引言 自欧洲信息安全协会&#xff08;Infosecurity Europe&#xff09;首次举办活动的 30 年来&#xff0c;网络安全格局发生了翻天覆地的变化。如今&#xff0c;网络安全领导者必须应对众多威胁&#xff0c;维持法规合规性&#xff0c;并与董事会成员合作推进组织的网络安…

uniapp 条件筛选

v3 版本 <template><view class"store flex "><view class"store_view"><view class"store_view_search flex jsb ac"><!-- <view class"store_view_search_select">全部</view> --><v…

pytorch问题汇总

conda环境下 通过torch官网首页 pip安装 成功运行 后面通过conda安装了别的包 似乎因为什么版本问题 就不能用了 packages\torch_init_.py", line 245, in _load_dll_libraries raise err OSError: [WinError 127] 找不到指定的程序。 Error loading ackages\torch\lib\c…

开发过的一个Coding项目

一、文档资料、人员培训&#xff1a; 1、文档资料管理&#xff1a;这个可以使用OnLineHelpDesk。 2、人员培训&#xff1a;可以参考Is an Online Medical Billing and Coding Program Right for You - MedicalBillingandCoding.org。 3、人员招聘、考核&#xff1a;可以在Onli…

数据仓库维度建模详细过程

数据仓库的维度建模&#xff08;Dimensional Modeling&#xff09;是一种以业务用户理解为核心的设计方法&#xff0c;通过维度表和事实表组织数据&#xff0c;支持高效查询和分析。其核心目标是简化复杂业务逻辑&#xff0c;提升查询性能。以下是维度建模的详细过程&#xff1…