MySQL索引原理以及SQL优化
案例
struct index_failure_t{int id;string name;int cid;int score;string phonenumber;}Map<int,index_failure>;
熟悉C++的同学知道,上述案例中,我们map底层是一颗红黑树,一个节点存储了一对kv(键值对),k是int类型,v是结构体类型。我们把大量的数据记录到这颗红黑树中。
对应到sql中,语法变成了
CREATE TABLE ‘index_failure_t’(‘id’ INT(11) NOT NULL AUTO_INCREAMENT,‘name’ VARCHAR(255) DEFAULT NULL,‘cid’ INT(11) DEFAULT NULL,‘score’ SAMLLINT DEFAULT 0,‘phonenumber’ VARCHAR(20),PRIMARY KEY(‘id’),)
其中PRIMARY KEY(‘id’)相当于C++案例中的map指定KEY的步骤。存储结构也由红黑树变成了B+树。
如果在其中再添加 KEY ‘name_idx‘ (‘name’)语句,在C++中相当于再建立Map<string,int>。如果要搜寻某些数据,则通过Map<string,int>获取到int,再根据这个int获取Map<int,index_failure>里的数据,这种做法叫做“回表查询”。这里的索引也叫二级索引或者辅助索引。
细节上有所差异,业务上高度相似。红黑树是二叉平衡搜索树,B+树是多路平衡搜索树。
Sql中的索引简介
索引,在sql底层的B+树中,就是各个节点的key。通过索引,可以快速地锁定数据的位置。
主键索引
它是非空唯一索引,一个表只有一个主键索引;在 innodb 中,主键索引的 B+ 树包含表数据信息。如果没有执行主键索引,那么会自动把第一个非空唯一索引设为主键,如果没有非空唯一索引,那么自动生成一个主键索引rowid。
PRIMARY KEY(key1, key2)
唯一索引
不可以出现相同的值,可以有 NULL 值;
UNIQUE(key)
普通索引
允许出现相同的索引内容;
INDEX(key) OR KEY(key[,...])
组合索引
对表上的多个列进行索引
索引代价
代价:占用空间,DML语句变慢(因为底层维护的数据结构变多了)。
索引的使用场景

B+树和红黑树
B+树:多路平衡搜索树
红黑树:二叉平衡搜索树
多路:一个节点可以有多个子节点。
二叉:一个节点只能由2个子节点。
平衡:平衡根节点到各个叶子节点的高度,提供稳定是时间搜索复杂度。
搜索树:是有序的树结构。

B+树并不是一个节点存储一条数据,而是一个节点存储16kb数据,叶子节点存储数据库数据,非叶子节点存储地址数据。这样做的目的是让B+树尽量是矮胖结构,减少磁盘IO的次数,因为每走到一个节点都要把节点的数据内容加载到内存中,进行一次磁盘IO,磁盘IO的耗时是内存IO的百倍。

B树则非叶子节点也存储数据信息。
innodb 体系结构

Buffer Pool主要用于缓存聚集索引和二级索引的B+树节点,也就是热门数据。
Change Buffer则专门用于缓存对聚集索引的修改操作。这些数据并不在 buffer pool 中,Change buffer 中的数据将会异步 merge 到 buffer pool 中。
Buffer Pool修改的数据会不经过内核的高速缓冲区,直接通过O_DIRECT刷入磁盘中。
SQL查询优化涉及原则及思路
EXPLAIN查询sql优化器方案
EXPLAIN是一个关键字,用于查询优化器解析和显示查询执行计划。
MySQL会解析查询,并返回一张执行计划表,该表描述了查询执行的步骤和顺序。执行计划表的列包括:
id:每个查询块(query block)的唯一标识符。
select_type:查询类型,例如SIMPLE(简单查询)、PRIMARY(主查询)等。
table:查询涉及的表名。
partitions:查询涉及的分区。
type:连接类型,例如ALL(全表扫描,尽量不要出现)、INDEX(索引扫描)、ref(索引值不好说、可能是非唯一索引)。
possible_keys:可能使用的索引。
key:实际使用的索引。
key_len:使用的索引的长度。
ref:连接条件,例如const(无需访问它表)。
rows:估计的返回行数。
filtered:过滤后的行百分比。
Extra:其他的附加信息。
覆盖索引
其实叫做索引覆盖更加合理,就是在辅助索引B+树里能找到全部所需数据,就不再进行回表查询了,可以减少查询耗时。这时候要求我们select语句尽量能包含辅助索引B+树的数据,而不是用select *。

最左匹配原则
最左匹配原则只适用于使用组合索引的情况,对于单列索引或者没有索引的情况,顺序并不重要。当查询语句中有多个条件,并且这些条件可以利用索引进行匹配时,最左匹配原则决定了如何使用索引进行匹配。我们可以通过利用最左匹配规则的思路,减少B+树的创建数量,也就是过度索引,比如一棵树虽然有组合索引,但是我们可以通过最左匹配规则只沿用其中一条索引也能起到相同的效果。同时组合索引的存在也能帮助我们复用索引减少回表次数。

索引下推

索引存储

索引失效
select ... where A and B 若 A 和 B 中有一个不包含索引,则索引失效;
索引字段参与运算,则索引失效;例如:from_unixtime(idx)= '2021-04-30'; 改成 idx = unix_timestamp("2021-04-30");
索引字段发生隐式转换,则索引失效;例如:将列隐式转换为某个类型,实际等价于在索引列上作用了隐式转换函数;
LIKE 模糊查询,通配符 % 开头,则索引失效;例如:select* from user where name like '%Mark';
在索引字段上使用 【NOT】【 <>】【 != 】索引失效;如果判断 id <> 0则修改为idx > 0 or idx < 0;
组合索引中,没使用第一列索引,索引失效;
Sql查询优化思路
查询频次较高且数据量大的表建立索引;
索引选择使用频次较高,过滤效果好的列或者组合;
使用短索引,能使得节点包含的信息多,较少磁盘 IO 操作;比如: smallint,tinyint;
对于组合索引,考虑最左侧匹配原则和覆盖索引;
尽量选择区分度高的列作为索引,该列的值相同的越少越好;
尽量扩展索引,在现有索引的基础上,添加复合索引;最多 6 个 索引;
不要 select *; 尽量只列出需要的列字段;方便使用覆盖索 引;
索引列,列尽量设置为非空;
可选:开启自适应 hash 索引或者调整 change buffer;
Sql查询优化方法
Show processlist:是一个用于查看当前正在运行的数据库连接和查询的 MySQL 命令。它会返回一个结果集,该结果集包含了当前活动的数据库连接的详细信息。通过查看 SHOW PROCESSLIST 的结果,你可以了解当前正在运行的查询、连接的用户、连接的状态以及查询执行的时间。这对于监视数据库的性能、识别慢查询或长时间运行的查询以及查找可能存在的连接问题都非常有用。
慢查询日志:慢查询是指执行时间较长的查询语句,可能会对数据库性能产生负面影响。通过开启慢日志,数据库会将执行时间超过设定阈值的查询语句记录到慢日志文件中,以便后续分析和优化。

相关文章:
MySQL索引原理以及SQL优化
案例 struct index_failure_t{int id;string name;int cid;int score;string phonenumber;}Map<int,index_failure>; 熟悉C的同学知道,上述案例中,我们map底层是一颗红黑树,一个节点存储了一对kv(键值对)&…...
[Bug] [OpenAI] [TypeError: fetch failed] { cause: [Error: AggregateError] }
[Bug] [OpenAI] [TypeError: fetch failed] { cause: [Error: AggregateError] } ubuntu20 win10 edge浏览器访问 服务器部署 页面打开后想使用chatgpt报错了 rootcoal-pasi1cmp:/www/wwwroot/ChatGPT-Next-Web# PORT3000 yarn start yarn run v1.22.19 warning package.json:…...
@ 代码随想录算法训练营第5周(C语言)|Day31(贪心算法)
代码随想录算法训练营第5周(C语言)|Day31(贪心算法) Day31、贪心算法(包含题目 455.分发饼干 376. 摆动序列 53. 最大子序和 ) 455.分发饼干 题目描述 假设你是一位很棒的家长,想要给你的孩…...
面试手写第二期 Promsie相关
文章目录 一. 手写实现PromiseA规范二. Promise.all实现三. Promise.race实现四. Promise.allsettled实现六. Promise.any实现六. 如何实现 Promise.map,限制 Promise 并发数七. 实现函数 promisify,把回调函数改成 promise 形式八. 并发请求控制 一. 手…...
Windows冷知识:最小化远程桌面与ffmpeg
Windows冷知识:最小化远程桌面与ffmpeg – WhiteNights Site 标签:ffmpeg, Windows, 冷知识 最小化远程桌面会中断ffmpeg的录制 我觉得这个应该算冷知识吧。 前情提要 远程桌面连接至虚拟机,并通过ffmpeg录屏 这里可能不太好理解。 我在用…...
12nm工艺,2.5GHz频率,低功耗Cortex-A72处理器培训
“ 12nm工艺,2.5GHz频率,低功耗Cortex-A72处理器培训” 本项目是真实项目实战培训,低功耗UPF设计,后端参数如下: 工艺:12nm 频率:2.5GHz 资源:2000_0000 instances 为了满足更多…...
网络编程套接字(2)
UDP数据报套接字编程 API介绍 DatagramSocket DatagramSocket是UDP的Socket,用于发送和接收数据报. 操作系统中有一类文件,就叫做socket文件(普通文件/目录文件:在硬盘上的) socket文件:抽象的表示了网卡这样的硬件设备 DatagramSocket就是对socket文件进行读写,也就是借助网…...
Elasticsearch:入门(二)
九. Elasticsearch的映射和分析 Elasticsearch的强大搜索引擎功能不仅源于其高效的分布式架构,还在于对数据的映射和分析的深度支持。通过合理的字段类型定义和灵活的分析器配置,可以使搜索更加精准、快速,并满足不同业务场景的需求。 9.1 …...
Debezium日常分享系列之:Debezium 2.6.0.Alpha1发布
Debezium日常分享系列之:Debezium 2.6.0.Alpha1发布 一、重大改变1.MongoDB2.重新选择列后处理器 二、改进和变化1.添加了新的匹配集合 API2.CloudEvents 架构名称自定义3.Oracle Infinispan 缓存改进4.支持 Spanner NEW_ROW_AND_OLD_VALUES 值捕获类型 一、重大改变…...
Phoncent博客,探索Rie Kudan的GPT创作之举
近日,大家都在谈论日本作家Rie Kudan,她凭借其小说《东京共鸣塔》("Tokyo-to Dojo-to")荣获了日本极具声望的芥川奖。这本小说引起了广泛的讨论和思考,因为令人惊讶的是,Kudan在其中直接引用了人…...
力扣hot100 划分字母区间 贪心 思维 满注释版
Problem: 763. 划分字母区间 文章目录 思路复杂度Code 思路 👨🏫 代码随想录 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( n ) O(n) O(n) Code class Solution {public List<Integer> partitionLabels(String s){// 创建哈希…...
linux下使用swap分区扩展内存
swap分区是什么? Swap分区是硬盘上的一个特殊区域,被操作系统用作虚拟内存。当系统的物理内存(RAM)被全部使用时,操作系统会将一部分数据移动到swap分区,以释放RAM上的空间。这个过程被称为"交换&quo…...
实现sleep函数
作用:让线程休眠,等到指定时间在重新唤起。 基于Date实现: 以上的代码不会让线程休眠,而是通过高负荷计算使cpu无暇处理其他任务。缺点是在sleep的过程中其他所有的任务都会被暂停,包括dom的渲染。sleep的过程中程序会…...
汽车销量可视化分析
目录 一.分析的背景、目的、意义 1、背景 2、目的 3、意义 二.数据来源 三.图表分析 1、汽车品牌销量柱状图 2、中国汽车销量柱状图 3、汽车销量前10排行柱状图 4、汽车厂商销量折线图 编辑5、汽车销量词云图 6、汽车车型销量 7、汽车价格分布雷达图 8、汽车分…...
代码随想录算法训练营DAY8 | 字符串(1)
一、LeetCode 344 反转字符串 题目链接: 344.反转字符串https://leetcode.cn/problems/reverse-string/ 思路:双指针法交换。 class Solution {public void reverseString(char[] s) {int n s.length;int left 0, right n-1;while(left < right){c…...
如何更改Outlook阅读邮件时的默认字体?
如果收到的邮件中未指定字体,outlook默认使用宋体显示。 如果觉得不好看,可以进行更改。但不是在outlook中更改,outlook中只是修改编辑器中的字体,和纯文本邮件浏览的字体,不能更改未指定字体的HTML邮件的显示字体。 …...
【C++基础入门】三、运算符(算术运算符、赋值运算符、比较运算符、逻辑运算符)
三、运算符 作用:用于执行代码的运算 本章我们主要讲解以下几类运算符: 运算符类型作用算术运算符用于处理四则运算赋值运算符用于将表达式的值赋给变量比较运算符用于表达式的比较,并返回一个真值或假值逻辑运算符用于根据表达式的值返回…...
ES7.17由于IP变化导致的故障及恢复
背景 1. k8s 升级,导致环境中的ES集群(7.17版本)重启 2. 集群由于在公有云环境,IP不固定(重启后IP可能发生变化),通过 svc 进行访问 curl xxx-master-svc:9200/_cat/health 3. 由多个sts一…...
uniapp H5 touchstart touchend 切换背景会失效,或者没用
uniapp H5 touchstart touchend 切换背景会失效,或者没用 直接上代码 (使用 class 以及 hover-class来设置样式) class 设置默认的背景图或者样式 hover-class 来设置按下的背景图 或者样式 抬起 按下 <view class"mp_zoom_siz…...
【word visio绘图】关闭visio两线交叉的跳线(跨线)
【visio绘图】关闭visio两线交叉的跳线(跨线) 1 如何在Visio绘图中关闭visio两线交叉的跳线(跨线)第一步:打开Visio并创建您的图形第二步:绘制您的连接线第三步:关闭跳线第四步:手动…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
