Mysql高手养成——第一章:索引知识,浅尝性能分析

news2024/11/17 14:30:28

📣 📣 📣 📢📢📢
我是小冷 侧重后端的全栈工程师,有关技术问题需要讨论交流的直接私信即可
当前专栏mysql高手养成系列- 第一章 索引与浅尝性能分析
✏️高质量技术专栏专栏链接: 微服务数据结构netty,单点登录,SSMSpringCloudAlibaba

Mysql高手养成——第一章:索引知识,浅尝性能分析

前言
和很多高级开发前辈交流的时候,多数人认为数据库是新人工程师经验获取最多的技术,他们认为数据库经验是能决定一个程序员的下限的。
所以相对扎实的数据库基础加上生产环境多变的需求 将 历练自己成为一个数据库高玩,在技术提升的道路上 保证下限提升上线是最稳妥的做法。
于是乎 新的专栏开始了 和小冷来一起稳固自己的楼盘 为之后万丈高楼平地起打下殷实基础
参考资料 :
黑马 mysql:https://www.bilibili.com/video/BV1Kr4y1i7ru
冰河大佬的 《mysql技术大全》
《高性能MySQL(第3版)》

存储引擎

我们在使用mysql的时候 就可以发现 在5.5之后 创建表的默认结构语句会带上engine = innodb 这个是默认的存储引擎。

innodb

是兼顾高性能和高可靠性的通用存储引擎

特点:

  • DML操作,遵循ACID模型 ,支持事务,行级锁,主外键约束
  • innodb引擎的每张表都有对应的表空间文件 存储表结构 (frm,sdi),数据和索引

image-20221229173605919

MYSQL三种引擎的对比

image-20221229173647914

我们如何去决定需要什么引擎呢?

  • innodb 是默认存储引擎如果在并发的情况下对数据一致性有要求,除了查询和插入之外还有很多更新和删除的操作,那么可以优先选择innodb
  • MyISAM 如果是以读和插入操作为主,更新和删除操作少,且对事务和并发的要求不是很高,那么可以选择这个引擎
  • MEMORY:将所有的数据保存在内存中,访问速度快,通常用于临时表的缓存,对表的大小有限制,且无法保证数据安全性

索引

索引(index)是帮助MySQL 的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。

图解

image-20221229174104660

优点:

提高检索效率,降低数据库IO成本,通过索引可以对数据进行排序,降低排序成本减少cpu资源的消耗

缺点:

索引也是占用空间的,索引大大提高了查询效率,但是降低了更新表的速度,对表的增删改效率会变低

存储引擎支持的索引类型

image-20221229174306854

B+ Tree(多路平衡查找树)

image-20221229174420567

为什么innodb要使用b+树来作为索引结构

  • 相比于二叉树层级少,效率更高
  • 对于b树 无论是叶子结点还是非叶子节点都会存储数据,这样导致一页中存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高度,导致性能降低;
  • 相对hash索引 b+树允许排位匹配且天然支持排序

Hash结构

才用hash算法将键和值转换成心的hash值 映射到对应的位置存在hash表中,如果两个或者多个映射到同一个位置,就会产生hash冲突,可以通过链表来解决

特点

  • hash索引只能对等比较,不支持范围查询
  • 无法利用索引完成排序操作
  • 查询效率高

image-20221229174515195

索引分类

image-20221229174919568

在innodb中 索引的存储形式,可以分为以下两种

  • 聚集索引(Clustered Index):将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据,必须有且只有一个
  • 二级索引(Secondary Index):将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键,可以存在多个

聚集索引选取规则:

  • 如果存在主键,主键索引就是聚集索引。
  • 如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引。
  • 如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引。

image-20221229175115213

如果我们需要查找一个人 比如 arm

image-20221229175148534

  • 先查询二级索引 拿到arm的id值
  • 返回去查找聚集索引下的表数据
  • 回显,这个过程我们成为回表查询

索引语法

创建索引

create index index_name on table_name(index_col_name)

查看索引

show index from table_name

删除索引

drop index index_name on table_name

SQL性能分析

查看sql频次

show global status like 'com%'

可以查看sql的执行次数,来根据结果分析数据库进行优化

慢查询日志

在sql中 慢查询日志是默认不开启的 我们需要自己设置,如果需要可以去修改mysql的配置文件,当有sql执行耗时超过我们设置的时间,我们就会在慢查询日志定位到这些sql

image-20221230134243869

profile

show profiles 可以在sql优化的时候让我们了解时间的消耗都在那里。通过 have_profiling参数,可以看到mysql当前支不支持profile操作

select @@have_profiling

默认的profiling 是关闭的 我们需要通过设置来开启

set profiling = 1

查看一系列业务sql操作的耗时情况

查看耗时基本情况
show PROFILE

查看指定queryid的sql语句各个阶段的耗时情况
show  profile for query query_id

查看指定query_id的sql cpu 使用情况
show profile cpu for query query_id

explain sql执行计划分析

image-20221230135519112

id 查询序列号,用来表示多表查询的时候操作表的顺序 (id相同执行顺序从上到下 id 不同值越大越先执行)

如果有用到子查询 就会出现 id 不同的情况 优先执行子查询的sql

最左前缀原则

他主要对于联合索引有约束,最左前缀是查询从索引的最左列开始,并且不跳过索引中的列,否则索引会失效

我们假设有数据表设置了一个三个字段的联合索引:

  • profession
  • age
  • status

image-20221230141105472

从下图执行的两个sql我们可以发现 如果去掉后面的条件,依然会走索引查询,但是不可以跳过中间字段

我们可以这么查 1 2 3 
也可以 1 2 
但是不可以 1 3 
也不可以 2 3
最左前缀法则 必须包含最左边的列 否则不会走索引 ,也不可以跳过列 否则索引会失效

索引失效情况

  1. 不要再索引列上进行函数运算 否则会导致索引失效
  2. 字符串类型没有加引号 索引也会失效
  3. 用模糊查询的时候 如果是尾部模糊那么索引不会失效 但是头部模糊会失效(如果是数字类型 模糊就会失效)
  4. 用or 分开的条件,一侧有索引一侧没有索引会导致索引失效,如两侧都用有索引 那么会生效
  5. 数据分布的情况 如果mysql评估索引比全表慢,那么就不会使用索引

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

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

相关文章

osgPBR(十五)镜面IBL--查看不同级别的HDR环境贴图

首先&#xff0c;设置可以使用Mipmap&#xff0c;启用三线性过滤&#xff0c;设置最大级别和最小级别 osg::ref_ptr<osg::TextureCubeMap> tcm new osg::TextureCubeMap; tcm->setTextureSize(128, 128);tcm->setFilter(osg::Texture::MIN_FILTER, osg::Texture:…

吃鸡达人分享顶级作战干货,让你的战斗力爆表!

大家好&#xff01;作为一位专业吃鸡行家&#xff0c;我将为大家分享一些热门话题和实用干货&#xff0c;帮助你提高游戏的战斗力&#xff0c;让你在绝地求生中立于不败之地&#xff01; 首先&#xff0c;让我们来谈谈绝地求生作图工具推荐。我们推荐使用一款专业的作图工具&am…

信息安全第三周++

公钥加密算法 公钥加密算法&#xff0c;也被称为非对称加密算法&#xff0c;是现代加密技术的核心概念。与传统的对称加密算法不同&#xff0c;非对称加密使用一对密钥&#xff1a;一个公钥和一个私钥。以下是公钥加密算法的基本思想和工作原理&#xff1a; 密钥对&#xff1a…

英语——谐音篇——单词——单词密码

记忆即联结&#xff0c;只要能建立有效的联结&#xff0c;就能很好地记住。在现实生活中&#xff0c;声音的联结模式能很好地帮助我们记忆。几乎每个学生都曾用谐音的方法记忆一些事物&#xff0c;但很多人都没有意识到&#xff0c;我们每个人都可以通过一定的练习&#xff0c;…

rust生命期

一、生命期是什么 生命期&#xff0c;又叫生存期&#xff0c;就是变量的有效期。 实例1 {let r;{let x 5;r &x;}println!("r: {}", r); }编译错误&#xff0c;原因是r所引用的值已经被释放。 上图中的绿色范围’a表示r的生命期&#xff0c;蓝色范围’b表示…

解决方案 | 法大大电子签赋能电力交易全流程电子化

随着电子签名技术的不断发展和完善&#xff0c;其在各个领域都得到了广泛的应用。尤其在电力交易场景中&#xff0c;电子签的应用能为电力交易带来极大的便利&#xff0c;带来多重价值点。与此同时&#xff0c;国家也出台了相应政策&#xff0c;全面推动各行各业的数字化转型建…

好看的货架效果(含3D效果)

搭配thymeleaf layui合成 货架一 1. css #gudinghuojia2F .layui-row { display: flex; justify-content: space-between; height: 100%;} #gudinghuojia2F .layui-col-xs10 {margin-right: 4%;} #gudinghuojia2F .layui-col-xs10:last-child {margin-right: 0;} .inner-ti…

C语言-变量与数据类型

一、基本语法 1、注释 注释&#xff08;Comments&#xff09;可以出现在代码中的任何位置&#xff0c;用来向用户提示或解释代码的含义。程序编译时&#xff0c;会忽略注释&#xff0c;不做任何处理。 C 语言有两种注释方式&#xff1a; &#xff08;1&#xff09;单行注释 …

【Verilog 教程】6.4Verilog竞争与冒险

关键字&#xff1a;竞争&#xff0c;冒险&#xff0c;书写规范 产生原因 数字电路中&#xff0c;信号传输与状态变换时都会有一定的延时。 在组合逻辑电路中&#xff0c;不同路径的输入信号变化传输到同一点门级电路时&#xff0c;在时间上有先有后&#xff0c;这种先后所形成…

面试题:Java8 lambda 表达式 forEach 如何提前终止?

文章目录 1.情景展示2.原因分析3.解决方案方案一&#xff1a;使用原始的foreach循环方式一&#xff1a;break方式二&#xff1a;return(不推荐使用) 方案二&#xff1a;抛出异常 1.情景展示 如上图所示&#xff0c;我们想要终止for循环&#xff0c;使用return。 执行结果如下&…

成为吃鸡战场的王者!分享顶级战术干货,助您提高战斗力!

各位吃鸡战场的玩家们&#xff0c;欢迎来到本视频&#xff01;在这里&#xff0c;我将为您呈现一些与众不同的吃鸡干货&#xff0c;帮助您提高战斗力、轻松吃鸡&#xff01; 首先&#xff0c;让我们谈一谈作图工具推荐。绝地求生作图工具是吃鸡玩家们的必备利器。我将给大家推荐…

python+vue电子资源管理系统

能实现不出家门就可以通过网络进行系统管理&#xff0c;交易等&#xff0c;而且过程简单、快捷。同样的&#xff0c;在人们的工作生活中&#xff0c;也就需要互联网技术来方便人们的日常工作生活&#xff0c;实现工作办公的自动化处理&#xff0c;实现信息化&#xff0c;无纸化…

1.物联网射频识别

1.RFID概念 RFID是Radio Frequency Identification的缩写&#xff0c;又称无线射频识别&#xff0c;是一种通信技术&#xff0c;可通过无线电讯号识别特定目标并读写相关数据&#xff0c;而无需与被识别物体建立机械或光学接触。 RFID&#xff08;Radio Frequency Identificati…

传染病学模型 | Python实现基于SIR模型分析Covid19爆发

效果一览 文章概述 传染病学模型 | Python实现基于SIR 模型分析Covid19爆发 源码设计 import jax.numpy as npimport matplotlib.pyplot

向量数据库库Milvus Cloud2.3 运维可靠,秒级故障恢复

Milvus 2.3.0 已经发布有一段时间了,正如二选一的选择题总会让人陷入纠结一般,不少社区用户反馈对于选择 Milvus 2.2.x 还是 Milvus 2.3.x 犹豫不已。 对此,我们的回答是:强烈建议升级至 Milvus 2.3.x 版本。 为什么?在回答此问题之前,先回顾一下近一年来业界发生了哪些变…

RabbitMQ的基本介绍

什么是MQ 本质是一个队列&#xff0c;只不过队列中存放的信息是message罢了&#xff0c;还是一种跨进程的通信机制&#xff0c;用于上下游传递信息。在互联网架构中&#xff0c;MQ是一种非常常见的上下游“逻辑解耦物理解耦”的消息通信服务。使用了MQ之后&#xff0c;信息发送…

Flutter笔记:滚动之-无限滚动与动态加载的实现

Flutter笔记 无限滚动与动态加载的实现 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/133342307 本文还…

C++的内存管理和模板

文章目录 一、内存管理1.内存的分布2.C中的动态内存管理3.重载new和重载delete4.new和delete的实现原理5.定位new 二、模板1.泛型编程2.函数模板1.定义模板2.实例化模板3.模板类型的参数4.非类型模板参数 3.类模板1.定义模板2.实例化模板3.模板的成员函数 总结 一、内存管理 1…

蓝桥杯每日一题2023.9.27

4408. 李白打酒加强版 - AcWing题库 题目描述 题目分析 对于这题我们发现有三个变量&#xff0c;店&#xff0c;花&#xff0c;酒的数量&#xff0c;对于这种范围我们使用DP来进行分析。 dp[i][j][k]我们表示有i个店&#xff0c;j朵花&#xff0c;k单位酒的集合&#xff0c…

逆向入门及实战

一、逆向工程介绍 1.1 什么是逆向工程 提到逆向工程可能大多数人第一印象就是非道德层面的软件破解&#xff0c;其实不然&#xff0c;逆向工程又称为逆向技术&#xff0c;是一种产品设计技术再现过程&#xff0c;即对一项目产品进行逆向分析及研究&#xff0c;从而演绎并得出该…