当前位置: 首页 > news >正文

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的同学知道&#xff0c;上述案例中&#xff0c;我们map底层是一颗红黑树&#xff0c;一个节点存储了一对kv&#xff08;键值对&#xff09;&…...

[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周&#xff08;C语言&#xff09;|Day31&#xff08;贪心算法&#xff09; Day31、贪心算法&#xff08;包含题目 455.分发饼干 376. 摆动序列 53. 最大子序和 &#xff09; 455.分发饼干 题目描述 假设你是一位很棒的家长&#xff0c;想要给你的孩…...

面试手写第二期 Promsie相关

文章目录 一. 手写实现PromiseA规范二. Promise.all实现三. Promise.race实现四. Promise.allsettled实现六. Promise.any实现六. 如何实现 Promise.map&#xff0c;限制 Promise 并发数七. 实现函数 promisify&#xff0c;把回调函数改成 promise 形式八. 并发请求控制 一. 手…...

Windows冷知识:最小化远程桌面与ffmpeg

Windows冷知识&#xff1a;最小化远程桌面与ffmpeg – WhiteNights Site 标签&#xff1a;ffmpeg, Windows, 冷知识 最小化远程桌面会中断ffmpeg的录制 我觉得这个应该算冷知识吧。 前情提要 远程桌面连接至虚拟机&#xff0c;并通过ffmpeg录屏 这里可能不太好理解。 我在用…...

12nm工艺,2.5GHz频率,低功耗Cortex-A72处理器培训

“ 12nm工艺&#xff0c;2.5GHz频率&#xff0c;低功耗Cortex-A72处理器培训” 本项目是真实项目实战培训&#xff0c;低功耗UPF设计&#xff0c;后端参数如下&#xff1a; 工艺&#xff1a;12nm 频率&#xff1a;2.5GHz 资源&#xff1a;2000_0000 instances 为了满足更多…...

网络编程套接字(2)

UDP数据报套接字编程 API介绍 DatagramSocket DatagramSocket是UDP的Socket,用于发送和接收数据报. 操作系统中有一类文件,就叫做socket文件(普通文件/目录文件:在硬盘上的) socket文件:抽象的表示了网卡这样的硬件设备 DatagramSocket就是对socket文件进行读写,也就是借助网…...

Elasticsearch:入门(二)

九. Elasticsearch的映射和分析 Elasticsearch的强大搜索引擎功能不仅源于其高效的分布式架构&#xff0c;还在于对数据的映射和分析的深度支持。通过合理的字段类型定义和灵活的分析器配置&#xff0c;可以使搜索更加精准、快速&#xff0c;并满足不同业务场景的需求。 9.1 …...

Debezium日常分享系列之:Debezium 2.6.0.Alpha1发布

Debezium日常分享系列之&#xff1a;Debezium 2.6.0.Alpha1发布 一、重大改变1.MongoDB2.重新选择列后处理器 二、改进和变化1.添加了新的匹配集合 API2.CloudEvents 架构名称自定义3.Oracle Infinispan 缓存改进4.支持 Spanner NEW_ROW_AND_OLD_VALUES 值捕获类型 一、重大改变…...

Phoncent博客,探索Rie Kudan的GPT创作之举

近日&#xff0c;大家都在谈论日本作家Rie Kudan&#xff0c;她凭借其小说《东京共鸣塔》&#xff08;"Tokyo-to Dojo-to"&#xff09;荣获了日本极具声望的芥川奖。这本小说引起了广泛的讨论和思考&#xff0c;因为令人惊讶的是&#xff0c;Kudan在其中直接引用了人…...

力扣hot100 划分字母区间 贪心 思维 满注释版

Problem: 763. 划分字母区间 文章目录 思路复杂度Code 思路 &#x1f468;‍&#x1f3eb; 代码随想录 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( n ) O(n) O(n) Code class Solution {public List<Integer> partitionLabels(String s){// 创建哈希…...

linux下使用swap分区扩展内存

swap分区是什么&#xff1f; Swap分区是硬盘上的一个特殊区域&#xff0c;被操作系统用作虚拟内存。当系统的物理内存&#xff08;RAM&#xff09;被全部使用时&#xff0c;操作系统会将一部分数据移动到swap分区&#xff0c;以释放RAM上的空间。这个过程被称为"交换&quo…...

实现sleep函数

作用&#xff1a;让线程休眠&#xff0c;等到指定时间在重新唤起。 基于Date实现&#xff1a; 以上的代码不会让线程休眠&#xff0c;而是通过高负荷计算使cpu无暇处理其他任务。缺点是在sleep的过程中其他所有的任务都会被暂停&#xff0c;包括dom的渲染。sleep的过程中程序会…...

汽车销量可视化分析

目录 一.分析的背景、目的、意义 1、背景 2、目的 3、意义 二.数据来源 三.图表分析 1、汽车品牌销量柱状图 2、中国汽车销量柱状图 3、汽车销量前10排行柱状图 4、汽车厂商销量折线图 ​编辑5、汽车销量词云图 6、汽车车型销量 7、汽车价格分布雷达图 8、汽车分…...

代码随想录算法训练营DAY8 | 字符串(1)

一、LeetCode 344 反转字符串 题目链接&#xff1a; 344.反转字符串https://leetcode.cn/problems/reverse-string/ 思路&#xff1a;双指针法交换。 class Solution {public void reverseString(char[] s) {int n s.length;int left 0, right n-1;while(left < right){c…...

如何更改Outlook阅读邮件时的默认字体?

如果收到的邮件中未指定字体&#xff0c;outlook默认使用宋体显示。 如果觉得不好看&#xff0c;可以进行更改。但不是在outlook中更改&#xff0c;outlook中只是修改编辑器中的字体&#xff0c;和纯文本邮件浏览的字体&#xff0c;不能更改未指定字体的HTML邮件的显示字体。 …...

【C++基础入门】三、运算符(算术运算符、赋值运算符、比较运算符、逻辑运算符)

三、运算符 作用&#xff1a;用于执行代码的运算 本章我们主要讲解以下几类运算符&#xff1a; 运算符类型作用算术运算符用于处理四则运算赋值运算符用于将表达式的值赋给变量比较运算符用于表达式的比较&#xff0c;并返回一个真值或假值逻辑运算符用于根据表达式的值返回…...

ES7.17由于IP变化导致的故障及恢复

背景 1. k8s 升级&#xff0c;导致环境中的ES集群&#xff08;7.17版本&#xff09;重启 2. 集群由于在公有云环境&#xff0c;IP不固定&#xff08;重启后IP可能发生变化&#xff09;&#xff0c;通过 svc 进行访问 curl xxx-master-svc:9200/_cat/health 3. 由多个sts一…...

uniapp H5 touchstart touchend 切换背景会失效,或者没用

uniapp H5 touchstart touchend 切换背景会失效&#xff0c;或者没用 直接上代码 &#xff08;使用 class 以及 hover-class来设置样式&#xff09; class 设置默认的背景图或者样式 hover-class 来设置按下的背景图 或者样式 抬起 按下 <view class"mp_zoom_siz…...

【word visio绘图】关闭visio两线交叉的跳线(跨线)

【visio绘图】关闭visio两线交叉的跳线&#xff08;跨线&#xff09; 1 如何在Visio绘图中关闭visio两线交叉的跳线&#xff08;跨线&#xff09;第一步&#xff1a;打开Visio并创建您的图形第二步&#xff1a;绘制您的连接线第三步&#xff1a;关闭跳线第四步&#xff1a;手动…...

OpenCore Legacy Patcher:终极指南让老旧Mac焕然新生

OpenCore Legacy Patcher&#xff1a;终极指南让老旧Mac焕然新生 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 你是否有一台被苹果官方放弃支持的老旧Mac&a…...

数据安全与性能瓶颈困扰企业?湖南天硕SSD固态硬盘带来航天级稳定体验

在数字化转型加速的今天&#xff0c;企业数据量呈指数级增长&#xff0c;随之而来的数据安全风险与存储性能瓶颈已成为众多企业&#xff0c;尤其是对数据可靠性要求极高的B端用户&#xff08;如企业采购负责人、技术总监&#xff09;面临的共同挑战。传统存储方案在应对复杂业务…...

利用快马平台AI快速构建游戏cc switch功能原型,十分钟实现创意验证

利用快马平台AI快速构建游戏cc switch功能原型 最近在开发一个小型游戏项目时&#xff0c;遇到了一个常见需求&#xff1a;需要快速测试和切换各种游戏功能。比如在调试阶段&#xff0c;可能需要临时开启无敌模式、无限弹药等功能。传统做法是为每个功能单独写调试代码&#x…...

如何用代码快速绘制专业图表?Mermaid Live Editor彻底改变你的可视化工作流

如何用代码快速绘制专业图表&#xff1f;Mermaid Live Editor彻底改变你的可视化工作流 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me…...

【水声信号处理】突破物理极限:下视多波束声呐超分辨率技术原理与公式详解

【水声信号处理】突破物理极限&#xff1a;下视多波束声呐超分辨率技术原理与公式详解 文章目录【水声信号处理】突破物理极限&#xff1a;下视多波束声呐超分辨率技术原理与公式详解一、 为什么我们需要“超分辨率”&#xff1f;&#xff08;痛点分析&#xff09;二、 声呐回波…...

别再死记硬背了!用74HC系列CMOS芯片,手把手带你理解逻辑门电平与噪声容限

74HC系列CMOS芯片实战&#xff1a;从数据手册到面包板的逻辑门电平全解析 当你在深夜调试一块74HC04反相器搭建的振荡电路时&#xff0c;示波器上本该清晰的方波却出现了毛刺和畸变——这种场景对电子爱好者来说再熟悉不过。本文将以74HC系列CMOS芯片为核心&#xff0c;通过五…...

Mi-Create:零基础打造个性化小米穿戴表盘的完整实战指南

Mi-Create&#xff1a;零基础打造个性化小米穿戴表盘的完整实战指南 【免费下载链接】Mi-Create Unofficial watchface creator for Xiaomi wearables ~2021 and above 项目地址: https://gitcode.com/gh_mirrors/mi/Mi-Create Mi-Create是一款专为小米穿戴设备用户打造…...

ThingsBoard生产环境部署选型指南:安装包 vs 源码,内存队列 vs RabbitMQ,如何根据项目规模做选择?

ThingsBoard生产环境部署架构选型实战指南 当技术团队准备将ThingsBoard投入实际生产环境时&#xff0c;面临的第一个关键决策往往不是"如何安装"&#xff0c;而是"以什么架构安装"。这个选择将直接影响未来三年的系统稳定性、扩展性和运维成本。作为经历过…...

Fluent Meshing体网格生成失败?别慌,先检查你的几何模型是不是‘点接触’了

Fluent Meshing体网格生成失败&#xff1f;别慌&#xff0c;先检查你的几何模型是不是‘点接触’了 当你在Fluent Meshing中看到体网格生成失败的红色报错提示时&#xff0c;那种感觉就像考试时突然发现漏做了一整页题目。特别是当截止日期迫在眉睫&#xff0c;这种报错往往让人…...

告别手动爆肝:用AiScan-N自动化你的CTF Web漏洞测试(SQL注入/文件上传实战)

智能渗透测试革命&#xff1a;AiScan-N在CTF中的实战应用与效率跃升 当凌晨三点的CTF比赛进入白热化阶段&#xff0c;你的眼皮开始打架&#xff0c;而对手却像永动机般不断提交flag——这种场景下&#xff0c;传统手动渗透测试的局限性暴露无遗。我曾亲眼见证一位资深红队成员…...