【MySQL】史上最全的MySQL高性能优化总结

news2024/9/19 14:12:04

【MySQL】史上最全的MySQL高性能优化总结

【1】深入理解MySQL索引底层数据结构与算法

1. 为什么不使用二叉树、红黑树、B树来作为索引?

2. MyISAM 与 Innodb存储引擎有什么区别?

3. MySQL 的索引按照功能分类可以分几种?

4. MySQL 的的聚集索引与非聚集索引是什么?

5. 为什么建议 InnoDB表必须建主键?

6. 为什么推荐使用整型的自增主键?为什么不用UUID?

7. 为什么非主键索引的叶子节点存储的是主键值?

8. 联合索引的底层存储结构长什么样?

【2】Explain详解与索引最佳实践

1. 使用Explain各个字段的含义 

2. SQL的优化法则

【3】SQL底层执行原理详解

图解MySQL架构

【4】MySQL索引优化实战(上)

1. 联合索引第一个字段用范围不会走索引怎么优化?

2. 什么是索引下推?

3. 为什么like KK% 会走索引?为什么范围查找(大于号)没有用索引下推优化?

4. trace工具的使用 

5. Order by与Group by优化

6. 单路排序与双路排序

7. 索引设计原则

【5】MySQL索引优化实战(下) 

1. 分页查询怎么优化?

2. MySQL的NLJ与BNL

3. 被驱动表的关联字段没索引为什么要选择使用 BNL 算法而不使用 NLJ 呢?

4. 关联SQL优化

5. count查询优化

【6】深入理解MySQL事务隔离级别与锁机制

1. 事务的ACID

2. 四种隔离级别 

3. MySQL中各种锁的分类 

4. 各个事务隔离级别所发生的问题-案例分析

5. MySQL锁优化建议

【7】深入理解MVCC与BufferPoll缓存机制

1. undo日志版本链与read view机制详解

2. Innodb引擎SQL执行的BufferPool缓存机制 


本人之前写过许多关于MySQL性能优化的文章,在这里会将它们做一个大串讲~

这里主要是讲解MySQL底层数据结构索引优化事务及其相关特性MVCC机制BufferPool缓存机制等内容。

【1】深入理解MySQL索引底层数据结构与算法

【MySQL】深入理解MySQL索引底层数据结构与算法_面向鸿蒙编程的博客-CSDN博客_图灵mysql 内存架构https://blog.csdn.net/weixin_43715214/article/details/127080931

1. 为什么不使用二叉树、红黑树、B树来作为索引?

一层表示一次IO,红黑树保证了平衡性,但是当数据量达到了千万级别,红黑树会达到将近24层

B树和B+树最大的区别就是,B+树的非叶子节点不存储data,只存储索引(指针),可以放更多的索引!

2. MyISAM 与 Innodb存储引擎有什么区别?

MyISAM 用的是非聚集索引方式,数据和索引落在不同的两个文件上。InnoDB 是聚集索引方式,数据和索引都存储在同一个文件。

MyISAM管理非事务,提供高速存储和检索以及全文搜索能力,如果再应用中执行大量select操作,应该选择MyISAM。

InnoDB用于事务处理,具有ACID事务支持等特性,如果在应用中执行大量insert和update操作,应该选择InnoDB。

3. MySQL 的索引按照功能分类可以分几种?

普通索引、唯一索引、主键索引、全局索引(基本不用)

4. MySQL 的的聚集索引与非聚集索引是什么?

InnoDB的主键索引就是聚集索引。在InnoDB中只有主键索引聚集索引其它都是非聚集的!!!

聚集索引最主要的优势就是查询快。如果要查询完整的数据行,使用非聚集索引往往需要回表才能实现,而使用聚集索引则能一步到位

一张表只能有一个聚集索引,但可以有多个非聚集索引。 

非聚集索引我们一般也称为二级索引或者辅助索引。使用聚集索引的时候,数据的查询效率高,但如果对数据进行插入,删除,更新等操作,效率会比非聚集索引

5. 为什么建议 InnoDB表必须建主键?

ibd 文件必须要用一棵B+树来组织!如果我们没有指定,那么这个动作将会由MySQL来完成,所以不推荐!

6. 为什么推荐使用整型的自增主键?为什么不用UUID?

整形比字符串(UUID)省空间

整形判断大小比字符串(UUID)效率要高(字符串是比较ASCALL码)

如果我们设计的主键它不是自增的话,那我们插入下一个节点的时候,那这棵B+树很可能需要频繁做平衡节点分裂,非常浪费性能!!!

7. 为什么非主键索引的叶子节点存储的是主键值?

非主键索引(二级索引)没有必要放一整张表的数据,因为主键索引里面已经放了。找到主键索引然后再做一次“回表”操作就行了!

8. 联合索引的底层存储结构长什么样?

【2】Explain详解与索引最佳实践

【MySQL】Explain详解与索引最佳实践_面向鸿蒙编程的博客-CSDN博客https://blog.csdn.net/weixin_43715214/article/details/127131144

1. 使用Explain各个字段的含义 

explain关键字一共有9个字段,我们需要了解它们的含义!

2. SQL的优化法则

(1)最左前缀法则

(2)尽量不要在索引列上做任何操作

(3)存储引擎不能使用索引中范围条件右边的列

(4)尽量使用覆盖索引,减少 select * 语句

(5)使用不等于(!= 或者 <>),not in,not exists 的时候无法使用索引

(6)is null,is not null 一般情况下也无法使用索引

(7)like以通配符开头('$abc...'),索引失效会变成全表扫描操作

(8)字符串不加单引号索引失效

(9)范围太大查询,不走索引

【3】SQL底层执行原理详解

【MySQL】SQL底层执行原理详解_面向鸿蒙编程的博客-CSDN博客_图灵mysqlhttps://blog.csdn.net/weixin_43715214/article/details/127190252

图解MySQL架构

【4】MySQL索引优化实战(上)

【MySQL】MySQL索引优化实战(上)_面向鸿蒙编程的博客-CSDN博客https://blog.csdn.net/weixin_43715214/article/details/127293804

1. 联合索引第一个字段用范围不会走索引怎么优化?

方法一:使用强制走索引,force index(idx_name_age_position),但是一般会更慢

方法二:覆盖索引(推荐!)

2. 什么是索引下推

SELECT * FROM employees 
WHERE name like 'LiLei%' AND age = 22 AND position ='manager';

这个查询在联合索引里匹配到名字是 'LiLei' 开头的索引之后,同时还会在索引里过滤age和position这两个字段,拿着过滤完剩下的索引对应的主键id再回表查整行数据。

索引下推的目的就是减少回表次数!!!

3. 为什么like KK% 会走索引?为什么范围查找(大于号)没有用索引下推优化?

-- ALL
EXPLAIN SELECT * FROM employees 
WHERE name > 'LiLei' AND age = 22 AND position ='manager';
 
-- range (不管数据量大小都会走索引)
EXPLAIN SELECT * FROM employees 
WHERE name like 'LiLei%' AND age = 22 AND position ='manager';
EXPLAIN SELECT * FROM employees_copy 
WHERE name like 'LiLei%' AND age = 22 AND position ='manager';

估计应该是MySQL认为范围查找过滤的结果集过大,like KK% 在绝大多数情况来看,过滤后的结果集比较小,所以这里MySQL选择给 like KK% 用了索引下推优化(不管数据量是大还是小!)

4. trace工具的使用 

第一阶段:SQL准备阶段,格式化sql

第二阶段:SQL优化阶段

第三阶段:SQL执行阶段 

5. Order by与Group by优化

我们要看order by后面的字段是否走索引,看的是Extra的值是否含有Using filesort,有则不走索引。

如果order by的条件不在索引列上,就会产生Using filesort能用覆盖索引尽量用覆盖索引!!!

6. 单路排序与双路排序

双路排序在8.0.20的版本后面基本被废弃了!

7. 索引设计原则

  • 代码先行,索引后上
  • 联合索引尽量覆盖条件
  • 不要在小基数字段上建立索引
  • 长字符串我们可以采用前缀索引
  • where与order by冲突时优先where

【5】MySQL索引优化实战(下) 

【MySQL】MySQL索引优化实战(下)_面向鸿蒙编程的博客-CSDN博客https://blog.csdn.net/weixin_43715214/article/details/127544276

1. 分页查询怎么优化?

关键是让排序时返回的字段尽可能少,所以可以让排序和分页操作先查出主键,然后根据主键查到对应的记录

-- 0.051s
select * from employees e 
inner join 
(select id from employees order by name limit 90000,5) ed 
on e.id = ed.id;

2. MySQL的NLJ与BNL

NLJ 嵌套循环连接 

BNL 基于块的嵌套循环连接 

3. 被驱动表的关联字段没索引为什么要选择使用 BNL 算法而不使用 NLJ 呢?

SQL不走索引

如果是 NLJ,那么扫描行数为 100 * 10000 = 100万次,这个是磁盘扫描。

如果是 BNL,那么它会有10000+100次的磁盘扫描,100万次的内存过滤

很显然,用BNL磁盘扫描次数少很多,相比于磁盘扫描,BNL的内存计算会快得多!

因此MySQL对于被驱动表的关联字段没索引的关联查询,一般都会使用 BNL 算法;如果有索引一般选择 NLJ 算法,有索引的情况下 NLJ 算法比 BNL算法性能更高。

4. 关联SQL优化

  • 被驱动表关联字段(尽量)一定要加索引
  • 小表驱动大表

5. count查询优化

当字段有索引时

count(*)≈count(1)>count(字段)>count(主键 id)

当字段无索引

count(*)≈count(1)>count(主键 id)>count(字段)

【6】深入理解MySQL事务隔离级别与锁机制

【MySQL】深入理解MySQL事务隔离级别与锁机制_面向鸿蒙编程的博客-CSDN博客_图灵 mysqlicon-default.png?t=M85Bhttps://blog.csdn.net/weixin_43715214/article/details/127594907

1. 事务的ACID

原子性、一致性、隔离性、持久性。

2. 四种隔离级别 

3. MySQL中各种锁的分类 

乐观锁 和 悲观锁;读锁、写锁、意向锁;表锁 和 行锁

4. 各个事务隔离级别所发生的问题-案例分析

5. MySQL锁优化建议

  • 尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁
  • 合理设计索引,尽量缩小锁的范围
  • 尽可能减少检索条件范围,避免间隙锁
  • 尽量控制事务大小,减少锁定资源量和时间长度,涉及事务加锁的SQL尽量放在事务最后执行
  • 尽可能低级别事务隔离

【7】深入理解MVCC与BufferPoll缓存机制

【MySQL】深入理解MVCC与BufferPoll缓存机制_面向鸿蒙编程的博客-CSDN博客_mysql mvcc和buffericon-default.png?t=M85Bhttps://blog.csdn.net/weixin_43715214/article/details/127672669

1. undo日志版本链与read view机制详解

undo日志版本链

undo日志版本链是指一行数据被多个事务依次修改过后,在每个事务修改完后,MySQL会保留修改前的数据undo回滚日志,并且用两个隐藏字段 trx_id 和 roll_pointer 把这些undo日志串联起来形成一个历史记录版本链。

read view机制

MVCC机制的实现就是通过read-view机制与undo版本链比对机制,使得不同的事务会根据数据版本链对比规则读取同一条数据在版本链上的不同版本数据。

2. Innodb引擎SQL执行的BufferPool缓存机制 

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

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

相关文章

《领导力就是不装》——读书摘要

最近阅读的这本领导力就是不装–游戏化思维引领管理变革&#xff0c;分析问题的视角有新意&#xff0c;值得一看。以下是我的一点读书摘要。 领导力的三个关键点 具备进行管理变革、引领大家去解决难题的能力。具备成就他人、成就团队&#xff0c;让人才涌现&#xff0c;引领…

100天精通Python(数据分析篇)——第69天:Pandas常用数据筛选方法(between、isin、loc、iloc)

文章目录每篇前言一、布尔索引二、between()三、isin()1. 单列筛选2. 多列筛选3. 通过字典的形式传递多个条件4. 删除异常值所在行5. isnotin实现四、loc、iloc&#xff08;重要&#xff09;0. 创建DataFrame1. 提取行数据2. 提取列数据3. 提取多列数据4. 提取指定行、指定列数…

vmware16安装windows server 2008 VMware Tools

vmware16安装windows server 2008,安装完成后不会自动安装VMware Tools。而是出现如下提示&#xff1a; 简易安装正在安装Windows Server 2008 R2 x64。安装完操作系统后&#xff0c;需要手动安装VMware Tools。请参阅 https://kb.vmware.com/s/article/78708 附件下载 本文…

FPGA时序优化技术之重定时(Retiming)

介绍 重定时&#xff08;Retiming&#xff09;是一个智能过程&#xff0c;通过组合延迟路径向后和/或向前移动和平衡寄存器以获得最佳定时&#xff0c;同时保持电路的功能行为。重定时算法可以在不考虑互连延迟的情 况下&#xff0c;在同一边沿上由一个时钟对电路进行定时时找到…

【Linux vim】vim的基本使用,命令模式的指令集

目录 1.yum相当于手机的应用商店 2.vim的3种常用的模式 3.vim的基本使用&#xff08;写出一个hello vim的代码&#xff09; 4. 命令模式的指令集 1.yum相当于手机的应用商店 1.1查找 [rootVM-24-5-centos ~]# yum list #查找所有的安装包 但是查找结果太多了&#xff0c;可…

神州战神笔记本清灰+换硅脂-记录

文章目录Introduction拆清灰涂抹硅脂安装开机测试Introduction 笔记本购买于2020年4月份左右&#xff0c;至今已使用2年半时间。CPU是i7-9750H&#xff0c;基准频率是2.6GHz, 用control center 3.0开静音模式CPU会自动降频到1.5~2.6之间&#xff0c;日常办公都有些卡顿&#x…

docker配置阿里云镜像加速

一、快速使用-docker配置阿里云镜像 1、安装&#xff0f;升级Docker客户端 推荐安装1.10.0以上版本的Docker客户端&#xff0c;参考文档docker-ce 2. 配置镜像加速器 针对Docker客户端版本大于 1.10.0 的用户 您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加…

架构师必读 —— 逻辑模型(2)

用三角逻辑阐明观点&#xff1a; 通常用三角逻辑来表示逻辑的三大要素之间的关系。所谓三角逻辑&#xff0c;就是“观点” “论据” “数据”之间保持协调一致。观 点是指&#xff0c;话题的结论、提案或意见、推论。论据是指&#xff0c;佐证观点 的原理、原则、规律、普遍倾向…

阿里云-数据仓库-数据分析开发神器-ODPS

一、 ODPS 基本面-F10 1、什么是ODPS&#xff1f; 1、开发数据处理服务(Open Data Processing Service&#xff0c;简称ODPS)&#xff0c;2016年后更名MaxComputer。ODPS是一种由阿里云自主研发&#xff0c;针对TB/PB级数据、实时性要求不高的分布式处理服务。主要服务于批量结…

NoSQL数据库原理与应用综合项目——MongoDB篇

NoSQL数据库原理与应用综合项目——MongoDB篇 文章目录NoSQL数据库原理与应用综合项目——MongoDB篇0、 写在前面1、本地数据或HDFS数据导入到MongoDB2、MongoDB数据库表操作2.1 Java API 连接MongoDB2.2 查询数据2.3 插入数据2.4 修改数据2.5 删除数据3、MongoDB数据库表进行数…

Prettier系列之配置

文章の目录一、在文件目录中创建一个.prettierrc文件二、添加规则1、Print Width2、Tab Width3、Tabs4、Semicolons4.1、true----在每个语句的末尾添加一个分号。4.2、false----只在可能导致ASI失败的行开头添加分号。5、Quotes6、Quote Props6.1、as-needed6.2、consistent6.3…

Compose挑灯夜看 - 照亮手机屏幕里面的书本内容

一、前言 上一篇文章 Compose回忆童年 - 手拉灯绳-开灯/关灯里面82年钨丝灯&#xff0c;让我又有了新的想法&#xff0c;我们怎么照亮手机里面的文本内容呢&#xff1f; 我们会在上一篇文章的基础上来实现“挑灯夜看”的功能&#xff0c;怎么下手呢&#xff1f;往下看&#x…

小程序01/小程序 全局配置 tabBar 介绍、小程序模板语法数据绑定 wxml渲染

一.全局配置 tabBar 介绍 tabBar说明: tabBar是配置全局 页面底部导航 tabBar内包含 页面底部导航 背景 按钮 文字 文字颜色 注意: tabBar内list 最多是 5 项 &#xff0c;最少是 2 项 二.小程序模板语法数据绑定 说明: index.js文件data内定义属性 在index.wxml内渲染 in…

靠steam搬砖项目,傻瓜式操作单日500+,可放大操作

在分享干货之前&#xff0c;作为一个从15年开始创业的过来人&#xff0c;先教大家怎么分辨网络上的项目靠不靠谱&#xff0c;以后擦亮眼睛再做&#xff0c;切记&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 1、回本周期性我这个人比较俗&#xff0c;创业就是…

我的世界(MC) forge 1.19.3 开服教程

Debian系统使用MCSManager9面板搭建Minecraft Java版MOD服务器的教程&#xff0c;本教程用的forge1.19.3服务端&#xff0c;用其他服务端的也可以参考一下。 其他版本我的世界服务器搭建教程&#xff1a;https://blog.zeruns.tech/tag/mc/各种Minecraft服务端介绍和下载&#…

双线性变换法MATLAB实现巴特沃斯低通滤波器

实验名称 数字信号处理实验4 实验&#xff08;实习&#xff09;日期 12.13 得分 指导老师 学院 电信院 专业 电子信息工程 年级 2020 班次 姓名 学号 20208327 1.实验目的 掌握利用MATLAB求滤波器阶数和自然截至频率&#…

手把手带你理解TPS趋势分析

在性能分析中,前端的性能工具,我们只需要关注几条曲线就够了:TPS、响应时间和错误率。这是我经常强调的。 但是关注 TPS 到底应该关注什么内容,如何判断趋势,判断了趋势之后,又该如何做出调整,调整之后如何定位原因,这才是我们关注 TPS 的一系列动作。 今天,我们就通…

SSM闲置物品

14-13开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a;基于s5m闲置物品交易系统 网站前台&#xff1a;关于我们、联系我们、公告信息、闲置物品、求购信息 管理员功能&…

SQL语句练习06

目录 一、建表 二、SQL语句练习 一、建表 一、建立如下学生表(命名格式“姓名拼音_三位学号_week8student”&#xff0c;如LBJ_023_week8student&#xff09; create table LYL_116_week8student(SNO int primary key, SNAME char(8) not null unique,SEX char(2), DEPTNO i…

初学Nodejs(7):mysql模块的简单使用

文章目录Nodejsmysql模块1、在项目中操作数据库的步骤1.1 安装操作mysql数据库的第三方模块&#xff08;mysql&#xff09;1.2 通过mysql模块连接到mysql数据库&#xff0c;并进行必要配置1.3 通过mysql模块执行sql语句1.3.1 查询数据1.3.2 插入数据插入数据的快捷方式1.3.3 更…