Mysql高可用|索引|事务 | 调优
前言

「作者主页」:雪碧有白泡泡
「个人网站」:雪碧的个人网站


文章目录
- 前言
- sql语句的执行顺序
- 关键词
- 连接
- 名字解释
- sql语句
- 面试坑点
- 存储引擎
- MYSQL存储引擎
- SQL优化
- 索引
- 索引失效
- 索引的数据结构
- 面试坑点
- 锁
- 事务
- 四大特性
- 事务的隔离级别
- MVCC
- 读写分离
- 面试坑点
- 书籍推荐
sql语句的执行顺序
我们在拿到sql片段的时候,我们去处理sql语句,见到众多的关键字时我们该如何去处理呢?
-
FROM:首先识别并检索FROM子句中指定的表或视图。如果有多个表,则进行必要的连接操作。
-
WHERE:接下来,将WHERE子句中指定的条件应用于从表或视图中检索到的行。只有满足条件的行才会被选中。
-
GROUP BY:如果有GROUP BY子句,那么结果集将根据指定的列进行分组。这一步将具有相似值的行组合成汇总行。
-
HAVING:在GROUP BY子句之后,HAVING子句用于过滤分组的行。你可以在HAVING子句中指定条件,以限制哪些组的行包含在结果中。
-
SELECT:然后对结果集应用SELECT子句,指定要检索的列。你可以使用聚合函数(如SUM、COUNT、AVG等)对分组或筛选后的数据进行计算。
-
DISTINCT:如果使用了DISTINCT关键字,将从结果集中删除重复的行。
-
ORDER BY:如果有ORDER BY子句,结果集将按照指定的列以及指定的顺序(升序或降序)进行排序。
-
LIMIT:最后,应用LIMIT子句以限制从查询结果返回的行数。这在只需要结果集的一个子集时非常有用。
关键词
连接
名字解释
- 内连接 :取得两张表中满足存在连接匹配关系的记录
- 外连接:不只取得两张表中满足存在连续匹配关系的记录,还包括某张表(或两张表)中不满足匹配关系的记录
- 交叉连接:笛卡尔积在sql中的实现
- 笛卡尔积:例如集合A={a,b},集合B={1,2,3},那么A✖ B={<a,o>,<a,1>,<a,2>,<b,0>,<b,1>,<b,2>,}。
sql语句

面试坑点
由于篇幅有限,我们以模拟数据库面试的角度去检验一下坑点
面试官:首先我想问一下你在建表过程中是否了解varchar和cahr的区别?
关键词:可变
面试官:若你在存储一些数据较大的类型时,blob和text是如何选择的
关键词:类型,容量,方式,操作
面试官:你知道datetime和timestamp的异同嘛?
关键词:范围,空间,时区,默认值
面试官:在mysql语句中,in和exists的区别是什么
关键词:表大小
面试官:你的项目库中有记录货币的场景嘛,用的是什么类型字段
关键词:精确数值
面试官:mysql怎么存储emoji的呢?
关键词:编码类型
面试官:你有好好了解删除操作嘛,请说出drop,delete与truncate的区别吧
关键词:类型,回滚,删除内容,删除速度
面试官:你了解过合并查询么,请说出UNION与UNION ALL的区别?
关键词:去重与性能
面试官:count(1 ) 、count(*) 、count(列名)的区别?
关键词:执行效果与执行速度
这些问题能答对几个? 是否需要回炉重造呢?
存储引擎
MYSQL存储引擎

MYSQL8渐渐流行,需要了解一下MyISAM。
SQL优化
sql优化是基于慢sql进行优化,主要有以下特征
- 慢查询日志 :开启MySQL的慢查询日志,再通过一些工具比如mysqldumpslow去分析对应的慢查询日志,当然现在一般的云厂商都提供了可视化的平台。
- 服务监控 :可以在业务的基建中加入对慢SQL的监控,常见的方案有字节码插桩、连接池扩展、ORM框架过程,对服务运行中的慢SQL进行监控和告警。
慢SQL优化主要有以下的方向

在SQL优化时,explain是优化的利器,我们平时的编写,也应该先explain,看查一下执行计划,看看是否有优化的空间
直接在select语句之前增加explain关键词,就会返回执行计划的信息

索引
这个是特别重要的内容,一定要彻底拿下
索引就像目录,帮助我们更快地查询表中的内容。当我们了解索引,我们要了解索引的物理存储方式,还要了解索引的特性,还要了解索引的方式有哪些,还有索引的对象

当我们在创建索引的时候我们需要注意索引的位置,和数量。我们应该将索引建在频繁查询的字段上面,不建议的有:
1. 低区分度的字段(性别)
2. 频繁更新的字段
3. 过长的字段(前缀索引):占位置太大
4. 无序值作为索引:主键有不确定性时,容易导致叶子节点频繁分裂,造成磁盘存储的碎片化
索引失效
- OR操作符
- 字段类型不匹配
- 使用了不适合索引的操作符
- 联合索引中未使用索引的列
- 索引列上使用函数或表达式
- 对索引进行运算
- 不等于或NOT IN操作符
- 使用IS NULL 或 IS NOT NULL操作符
- 关联字段编码格式不一致
- 优化器估计全表扫描更快
索引的数据结构
MySQL的默认存储引擎是InnDB,它使用B+树结构实现索引。B+树索引的结构简洁明了,具有以下特点:
+ 每个节点可以存储多个键值对,叶子节点可以存储实际的数据记录
+ 非叶子节点用于指引搜索方向,只存储了键值
+ 叶子节点之间使用双向指针连接,形成有序链表,方便范围查询和排序操作
+ B+树高度相对较低,可以减少磁盘的 I/O 操作
我们小结一下可以说B+树是一个树高相对较低,节点存储键值指引存储数据的叶子节点,而叶子节点之间为了方便查询排序操作用双指针形成了有序链表
我们了解完索引的一些基本内容我们继续以面试题的角度去思考这些知识点
面试坑点
- 索引不适合哪些场景
- 你了解聚簇索引和非聚簇索引么
- 你了解覆盖索引么
- 索引是不是建的越多越好
- 你了解了MYSQL的数据结构是B+树,那么一棵B+树能存储多少条数据呢?
- 那为什么要用B+树,而不用二叉树和平衡二叉树
- 那Hash和B+索引的区别是什么呢
- 回表了解嘛
- 说说最左前缀原则/最左匹配原则
- 说说mysql5.6版本添加的索引下推优化
锁

当谈到MySQL锁时,重要的内容包括锁粒度、锁模式、加锁机制和兼容性。
锁粒度是指锁定数据库对象的级别,包括行锁、页锁和表锁。行锁是最细粒度的锁,它锁定了表中的单个行,其他事务无法修改或访问该行。页锁是在页的级别上进行锁定,可以锁定一组相邻的行。表锁是最粗粒度的锁,它锁定整个表,其他事务无法修改或访问表中的任何行。
锁模式是锁定的方式,常见的锁模式包括记录锁、间隙锁、next-key锁、意向锁和插入意向锁。记录锁用于锁定行,间隙锁用于锁定区间,next-key锁是记录锁和间隙锁的组合,用于避免幻读问题。意向锁用于标识一个事务即将在某个粒度上加锁,插入意向锁用于表示事务即将在某个范围内插入新行。
加锁机制包括乐观锁和悲观锁。乐观锁假设并发操作不会产生冲突,只在提交时检查是否有其他事务修改了数据。悲观锁则假设并发操作可能会产生冲突,在整个操作过程中都持有锁,避免冲突的发生。
最后,兼容性指的是共享锁和排他锁之间的兼容性。共享锁允许多个事务同时读取但不允许修改数据,而排他锁在持有锁的事务完成之前不允许其他事务读取或修改数据。兼容性确保了事务之间的并发性和数据的一致性。
灵魂问题:mysql遇到过死锁嘛,你是如何解决的??
事务
四大特性
MySQL事务的四大特性,也被称为ACID特性,指的是原子性(Atomicity)、一致性
(Consistency)、隔离性(Isolation)和持久性(Durability)。
事务的隔离级别
事务的隔离级别决定了并发事务之间的可见性和影响范围,包括读取未提交数据(ReadUncommitted)、读取已提交数据(Read Committed)、可重复读(RepeatableRead)和串行化(Serializable)。
MySQL的默认隔离级别是可重复读(Repeatable Read),核心内容是保证在事务期间读取的数据不会受到其他并发事务的修改影响。然而,可重复读隔离级别仍可能导致幻读(Phantom Read)、脏读(Dirty Read)和不可重复读(Non-repeatable Read)的问题,其中幻读指的是一个事务在读取某个范围内的数据时,另一个事务在该范围内插入了新的数据,导致第一个事务的结果集发生变化;脏读指的是一个事务读取了另一个未提交事务的数据;不可重复读指的是在同一个事务中,多次读取同一条数据的结果不一致。
MVCC
MVCC是一种并发控制技术,通过为每个事务创建多个版本的数据来实现隔离性和并发性。
读写分离
数据库的读写分离是一种架构设计,旨在优化数据库性能并提高系统的可扩展性。它将数据库操作分为读操作和写操作,然后将这些操作分配给不同的数据库实例来处理。
实现读写分离的过程通常涉及以下几个步骤:
-
配置主数据库(写库):为系统配置一个主数据库实例,负责处理所有写操作(如插入、更新、删除)。
-
配置从数据库(读库):配置一个或多个从数据库实例,用于处理读操作(如查询)。
-
同步主数据库和从数据库:确保从数据库与主数据库的数据保持同步。这可以通过数据库复制技术来实现,主数据库将写操作的日志传输给从数据库,并在从数据库上重放这些日志来保持数据一致性。
-
路由读操作到从数据库:在应用程序中使用合适的策略将读操作路由到从数据库。这可以通过使用负载均衡器或在应用程序代码中进行手动配置来完成。
-
处理写操作到主数据库:所有写操作都发送到主数据库进行处理。
我们了解完一些基本内容我们继续以面试题的角度去思考这些知识点
面试坑点
- 主从复制原理你了解多少
- 主从同步延迟你了解么,该如何处理
- 你一般是如何分库的
- 那你一般是怎么分表的
- 水平分表有哪几种路由方式
- 不停机扩容如何实现
- 常用的分库分表中间件有哪些
- 说了这么多分表分库,你觉得这样会带来什么影响呢
- 百万级别以上的数据如何删除
- 百万千万级的大表改如何添加字段
- MySQL数据库cpu飙升怎么办
面对这篇文章的面试问题,你是否需要回炉重造呢?
这本热销并累计十万的评论的书安利给大家,并以活动的形式送出1-3本
京东链接 :https://item.jd.com/13393259.html#crumb-wrap

书籍推荐

- 🎁本次送书1~3本【取决于阅读量,阅读量越多,送的越多】👈
- ⌛️活动时间:截止到2023-12月15号
- ✳️参与方式:关注博主+三连(点赞、收藏、评论)
相关文章:
Mysql高可用|索引|事务 | 调优
前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 文章目录 前言sql语句的执行顺序关键词连接名字解释sql语句 面试坑点存储引擎MYSQL存储引擎 SQL优化索引索引失效索引的数据结构面试坑点 锁事务四大特性事务的隔离级别MVCC 读写分离面试坑…...
电机驱动开发
最近在搞电机驱动程序,感觉很简单,实际操作却发现里面还有很多猫腻(细节)。 电机在嵌入式设备中非常常见,例如云台的转动,都是靠电机来驱动的。 电机常见分步进电机、直流电机,相对来说步进电机…...
基于PaddleNLP的深度学习对文本自动添加标点符号(一)
前言 目前以深度学习对文本自动添加标点符号研究很少,已知的开源项目并不多,详细的介绍就更少了,但对文本自动添加标点符号又在古文识别语音识别上有重大应用。 基于此,本文开始讲解基于PaddleNLP的深度学习对文本自动添加标点符号…...
“Java已死、前端已凉”?尊嘟假嘟?
一、为什么会出现“Java已死、前端已凉”的言论 “Java已死、前端已凉”的言论出现,主要是由于以下几个原因: 技术更新迅速:随着互联网技术的发展,新的编程语言和技术不断涌现。Java和前端技术作为广泛应用的技术,面临…...
双向无线功率传输系统MATLAB仿真
微❤关注“电气仔推送”获得资料(专享优惠) 模型简介: 初级侧转换器通过双向 AC/DC 转换器从电网获取电力,并由直流线电压 Vin 供电,而拾波侧被视为连接到 EV,并由连接到任一存储的单独直流源 Vout 表示或…...
火山引擎DataLeap:助你实现从数据研发1.0到数据研发3.0的跨越
更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 近日,火山引擎开发者社区 Meetup 第 12 期暨超话数据专场在深圳举办,本次活动主题为“数智化转型背景下的火山引擎大数据技术揭秘 ”&#x…...
DevOps 和人工智能 – 天作之合
如今,人工智能和机器学习无处不在,所以它们开始在 DevOps 领域崭露头角也毫不令人意外。人工智能和机器学习正在通过自动化任务改变 DevOps,并使各企业的软件开发生命周期更高效、更深刻和更安全。我们在 DevOps 趋势中简要讨论过这一问题&am…...
基于主动安全的AIGC数据安全建设
面对AIGC带来的数据安全新问题,是不是就应该一刀切禁止AIGC的研究利用呢?答案是否定的。要发展AIGC,也要主动积极地对AIGC的数据安全进行建设。让AIGC更加安全、可靠的为用户服务。为达到此目的,应该从三个方面来开展AIGC的数据安…...
Java 程序的命令行解释器
前几天我写了一个简单的词法分析器项目:https://github.com/MarchLiu/oliva/tree/main/lora-data-generator 。 通过词法分析快速生成 lora 训练集。在这个过程中,我需要通过命令行参数给这个 java 程序传递一些参数。 这个工作让我想起了一些不好的回忆…...
从事开发近20年,经历过各种技术的转变和进步
1、jsp、javabean、servlet、jdbc。 2、Struts1、hibernate、spring。 3、webwork、ibatis、spring 4、Struts2、mybatis、spring 5、spring mvc ,spring全家桶 6、dubbo,disconf 微服务,soa 7、springboot 全家桶 8、docker 9、dock…...
unet v2学习笔记
unet v2介绍: UNet v2开源!比UNet显存占用更少、参数更少,猛涨20个mIoU 代码:https://github.com/yaoppeng/U-Net_v2 模型96m。 实际测试,1060显卡,256*256,需要13ms。 速度慢于rvm人脸分割…...
MQ入门—centos 7安装RabbitMQ 安装
三:RabbitMQ 安装 1.环境准备 Linux 的 CentOS 7.x 版本。Xftp 传输安装包到 Linux。Xshell 连接 Linux,进行解压安装。 RabbitMQ安装包 链接:https://pan.baidu.com/s/1ZYVI4YZlvMrj458jakla9A 提取码:dyto xshell安装包 链接&…...
虾皮Shopee商品详情API:电商实时数据获取的关键
随着互联网的普及和电子商务的快速发展,电商行业已经成为全球范围内最具影响力和前景的产业之一。在电商行业中,商品详情API接口是实现快速、准确获取商品信息的关键技术之一。本文将介绍获得虾皮Shopee根据ID取商品详情 API在电商行业里的重要性&#x…...
VUE中的8种常规通信方式
文章目录 1.props传递数据(父向子)2.$emit触发自定义事件(子向父)3.ref(父子)4.EventBus(兄弟组件)5.parent或root(兄弟组件,有共同祖辈)6.attrs和listeners(…...
overleaf 加载pdf格式的矢量图时,visio 图片保存为pdf格式,如何确保pdf页面大小和图片一致
Overleaf支持多种矢量图形格式,其中一些常见的包括: PDF(Portable Document Format): PDF是一种常见的矢量图形格式,Overleaf可以直接加载和显示PDF文件。许多绘图工具和LaTeX生成的图形都可以导出为PDF格式…...
西南科技大学数字电子技术实验四(基本触发器逻辑功能测试及FPGA的实现)预习报告
一、计算/设计过程 说明:本实验是验证性实验,计算预测验证结果。是设计性实验一定要从系统指标计算出元件参数过程,越详细越好。用公式输入法完成相关公式内容,不得贴手写图片。(注意:从抽象公式直接得出结果,不得分,页数可根据内容调整) (1)D触发器 特征方程: Q…...
“新程序员”必须学会的8个GPT提问技术 | 抢免费注册DevChat名额
ChatGPT 等大语言模型给人带来惊喜也给人带来了焦虑。惊喜在于它给各种工作带来的提效是肉眼可见的,焦虑在于很多人都担心会被 AI 替代,可能工程师们对此最深有感触。很多工程师已经开始用 GPT 来处理一些手头的开发工作,可能是写脚本&#x…...
Flink系列之:大状态与 Checkpoint 调优
Flink系列之:大状态与 Checkpoint 调优 一、概述二、监控状态和 Checkpoints三、Checkpoint 调优四、RocksDB 调优五、增量 Checkpoint六、RocksDB 或 JVM 堆中的计时器七、RocksDB 内存调优八、容量规划九、压缩十、Task 本地恢复十一、主要(分布式存储…...
七轴开源协作机械臂myArm视觉跟踪技术!
引言 ArUco标记是一种基于二维码的标记,可以被用于高效的场景识别和位置跟踪。这些标记的简单性和高效性使其成为机器视觉领域的理想选择,特别是在需要实时和高精度跟踪的场景中。结合机器学习和先进的图像处理技术,使用ArUco标记的机械臂系统…...
etcd初探
官方网站 https://etcd.io/ etcd是什么 etcd is a strongly consistent, distributed key-value store that provides a reliable way to store data that needs to be accessed by a distributed system or cluster of machines. It gracefully handles leader elections du…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
