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

前言

在这里插入图片描述
「作者主页」:雪碧有白泡泡
「个人网站」:雪碧的个人网站
请添加图片描述

请添加图片描述

文章目录

  • 前言
  • sql语句的执行顺序
  • 关键词
    • 连接
      • 名字解释
      • sql语句
    • 面试坑点
    • 存储引擎
      • MYSQL存储引擎
  • SQL优化
  • 索引
    • 索引失效
    • 索引的数据结构
    • 面试坑点
  • 事务
    • 四大特性
    • 事务的隔离级别
        • MVCC
    • 读写分离
    • 面试坑点
  • 书籍推荐

sql语句的执行顺序

我们在拿到sql片段的时候,我们去处理sql语句,见到众多的关键字时我们该如何去处理呢?

  1. FROM:首先识别并检索FROM子句中指定的表或视图。如果有多个表,则进行必要的连接操作。

  2. WHERE:接下来,将WHERE子句中指定的条件应用于从表或视图中检索到的行。只有满足条件的行才会被选中。

  3. GROUP BY:如果有GROUP BY子句,那么结果集将根据指定的列进行分组。这一步将具有相似值的行组合成汇总行。

  4. HAVING:在GROUP BY子句之后,HAVING子句用于过滤分组的行。你可以在HAVING子句中指定条件,以限制哪些组的行包含在结果中。

  5. SELECT:然后对结果集应用SELECT子句,指定要检索的列。你可以使用聚合函数(如SUM、COUNT、AVG等)对分组或筛选后的数据进行计算。

  6. DISTINCT:如果使用了DISTINCT关键字,将从结果集中删除重复的行。

  7. ORDER BY:如果有ORDER BY子句,结果集将按照指定的列以及指定的顺序(升序或降序)进行排序。

  8. 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. 无序值作为索引:主键有不确定性时,容易导致叶子节点频繁分裂,造成磁盘存储的碎片化

索引失效

  1. OR操作符
  2. 字段类型不匹配
  3. 使用了不适合索引的操作符
  4. 联合索引中未使用索引的列
  5. 索引列上使用函数或表达式
  6. 对索引进行运算
  7. 不等于或NOT IN操作符
  8. 使用IS NULL 或 IS NOT NULL操作符
  9. 关联字段编码格式不一致
  10. 优化器估计全表扫描更快

索引的数据结构

MySQL的默认存储引擎是InnDB,它使用B+树结构实现索引。B+树索引的结构简洁明了,具有以下特点:
+ 每个节点可以存储多个键值对,叶子节点可以存储实际的数据记录
+ 非叶子节点用于指引搜索方向,只存储了键值
+ 叶子节点之间使用双向指针连接,形成有序链表,方便范围查询和排序操作
+ B+树高度相对较低,可以减少磁盘的 I/O 操作
我们小结一下可以说B+树是一个树高相对较低,节点存储键值指引存储数据的叶子节点,而叶子节点之间为了方便查询排序操作用双指针形成了有序链表

我们了解完索引的一些基本内容我们继续以面试题的角度去思考这些知识点

面试坑点

  1. 索引不适合哪些场景
  1. 你了解聚簇索引和非聚簇索引么
  1. 你了解覆盖索引么
  1. 索引是不是建的越多越好
  1. 你了解了MYSQL的数据结构是B+树,那么一棵B+树能存储多少条数据呢?
  1. 那为什么要用B+树,而不用二叉树和平衡二叉树
  1. 那Hash和B+索引的区别是什么呢
  1. 回表了解嘛
  1. 说说最左前缀原则/最左匹配原则
  1. 说说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是一种并发控制技术,通过为每个事务创建多个版本的数据来实现隔离性和并发性。

读写分离

数据库的读写分离是一种架构设计,旨在优化数据库性能并提高系统的可扩展性。它将数据库操作分为读操作和写操作,然后将这些操作分配给不同的数据库实例来处理。

实现读写分离的过程通常涉及以下几个步骤

  1. 配置主数据库(写库):为系统配置一个主数据库实例,负责处理所有写操作(如插入、更新、删除)。

  2. 配置从数据库(读库):配置一个或多个从数据库实例,用于处理读操作(如查询)。

  3. 同步主数据库和从数据库:确保从数据库与主数据库的数据保持同步。这可以通过数据库复制技术来实现,主数据库将写操作的日志传输给从数据库,并在从数据库上重放这些日志来保持数据一致性。

  4. 路由读操作到从数据库:在应用程序中使用合适的策略将读操作路由到从数据库。这可以通过使用负载均衡器或在应用程序代码中进行手动配置来完成。

  5. 处理写操作到主数据库:所有写操作都发送到主数据库进行处理。

我们了解完一些基本内容我们继续以面试题的角度去思考这些知识点

面试坑点

  1. 主从复制原理你了解多少
  1. 主从同步延迟你了解么,该如何处理
  1. 你一般是如何分库的
  1. 那你一般是怎么分表的
  1. 水平分表有哪几种路由方式
  1. 不停机扩容如何实现
  1. 常用的分库分表中间件有哪些
  1. 说了这么多分表分库,你觉得这样会带来什么影响呢
  1. 百万级别以上的数据如何删除
  1. 百万千万级的大表改如何添加字段
  1. MySQL数据库cpu飙升怎么办

面对这篇文章的面试问题,你是否需要回炉重造呢?

这本热销并累计十万的评论的书安利给大家,并以活动的形式送出1-3本

京东链接 :https://item.jd.com/13393259.html#crumb-wrap

在这里插入图片描述

书籍推荐

在这里插入图片描述

  • 🎁本次送书1~3本【取决于阅读量,阅读量越多,送的越多】👈
  • ⌛️活动时间:截止到2023-12月15号
  • ✳️参与方式:关注博主+三连(点赞、收藏、评论)
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大师学SwiftUI第12章 - 手势 Part 1

手势识别器 手势是用户在屏幕上执行的动作&#xff0c;如点击、滑动或捏合。这些手势很难识别&#xff0c;因为屏幕上只能返回手指的位置。为此&#xff0c;Apple提供了手势识别器。手势识别器完成所有识别手势所需的计算。所以我们不用处理众多的事件和值&#xff0c;只需在等…

公共字段自动填充——后端

场景&#xff1a;当处理一些请求时&#xff0c;会重复的对数据库的某些字段进行赋值&#xff08;如&#xff1a;在插入和更新某个物品时&#xff0c;需要更新该物品的更新时间和更新者的信息&#xff09;&#xff0c;这样会导致代码冗余。 如&#xff1a; 思路&#xff1a; 自…

避免付费搜索广告系列与有机搜索广告系列之间出现关键词蚕食现象

自然搜索&#xff08;搜索引擎优化&#xff09;和付费搜索&#xff08;或按点击付费&#xff09;具有足够的技术复杂性和战略方面。 关键词蚕食是一个可能使它们变得更加困难的问题——如果你的搜索引擎优化 &#xff08;SEO&#xff09; 和按点击付费 &#xff08;PPC&#x…

【Python】获取B站粉丝列表保存至数据库中

分析网络请求&#xff0c;获取到有粉丝接口的数据url 可以在响应信息处看到粉丝的信息 通过浏览器也可以直接请求到具体的JSON信息 通过独立的标签我们可以看到接口数据&#xff0c;但是要注意如果不是查看自己登录账户的接口那么就无法查询到所有粉丝的数据&#xff0c;默认只…

Python通过函数名调用函数的几种场景

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 除了执行系统命令外&#xff0c;我们有时还需要动态地执行一些python代码&#xff0c;有经验的朋友就会知道可以使用内置函数eval实现这一需求&#xff0c;如eval(“…

Appcelerator打包ipa有哪些优势

大家好&#xff0c;我是咕噜-凯撒&#xff0c;我们得先知道Appcelerator是啥&#xff0c;Appcelerator&#xff08;现在更名为Axway Titanium&#xff09;是一个跨平台的移动应用开发框架通过提供一种简化和加速移动应用开发的方式帮助你构建高质量的跨平台应用程序。那使用App…

【基础篇】YOLO系列训练环境(GPU)搭配篇

🚀Pytorch环境配置(Windows) 🔨 Anaconda安装 此处下载安装即可 ⭐温馨提示:安装路径不能含有中文,建议不要安在c盘(很占内存) 环境变量配置 编辑系统环境变量 -> 环境变量 -> 系统变量 新建并添加以下路径 打开cmd,输入conda&

设计模式—装饰模式

与其明天开始&#xff0c;不如现在行动&#xff01; 文章目录 装饰模式—穿衣服&#x1f48e;总结 装饰模式—穿衣服 装饰模式&#xff08;Decorator&#xff09;可以动态的给对象添加一些额外的职责。 Component是定义一个对象接口&#xff0c;可以给这些对象动态地添加职责。…

【深度学习目标检测】十、基于yolov5的火灾烟雾识别(python,目标检测)

YOLOv5是目标检测领域一种非常优秀的模型&#xff0c;其具有以下几个优势&#xff1a; 1. 高精度&#xff1a;YOLOv5相比于其前身YOLOv4&#xff0c;在目标检测精度上有了显著的提升。YOLOv5使用了一系列的改进&#xff0c;如更深的网络结构、更多的特征层和更高分辨率的输入图…

Vditor - Markdown编辑器使用

1、安装 yarn add vditor2、代码 import vditor/dist/index.css; import React, { useEffect } from react; import Vditor from vditor; import ./index.less;const App ({ setVditorValue, vditorValue }: any) > {const [vd, setVd] React.useState<Vditor>();…

Redis-网络模型

参考资料 &#xff1a;极客时间 Redis&#xff08;亚风&#xff09; 前置知识 系统隔离 为了避免⽤户应⽤导致冲突甚⾄内核崩溃&#xff0c;⽤户应⽤与内核是分离的&#xff1a; 进程的寻址空间会划分为两部分&#xff1a;内核空间、⽤户空间 • ⽤户空间只能执⾏受限的命令&…

激活函数-SwiGLU

SwiGLU SiLU 函数是一种神经网络中的激活函数&#xff0c;全称是 Sigmoid Linear Unit, 也被称为 Swish 函数。它由 Google Brain 在 2017 年提出&#xff0c;是一种非线性激活函数&#xff0c;能够有效地对神经网络的输入进行非线性变换。 定义 f ( x ) x ∗ σ ( x ) f(x)…

vue3使用vue-router嵌套路由(多级路由)

文章目录 1、Vue3 嵌套路由2、项目结构3、编写相关页面代码3.1、编写route文件下 index.ts文件3.2、main.ts文件代码&#xff1a;3.3、App.vue文件代码&#xff1a;3.4、views文件夹下的Home文件夹下的index.vue文件代码&#xff1a;3.5、views文件夹下的Home文件夹下的Tigerhh…

生命在于学习——TV电视盒子渗透测试抓包设置

一、前言 封面图是示例图&#xff0c;因为涉及到保密&#xff0c;所以本次测试的电视盒子不放出外观和设置界面。 这一次要测试电视盒子&#xff0c;大家也都知道&#xff0c;市面上的电视盒子大部分都是Android&#xff0c;当然&#xff0c;要使用笔记本去抓电视盒子的数据包…

圣诞节来了,为大家送上专属圣诞树

Hello大家好&#xff0c;我是Dream。 今天给大家分享一下我很早之前做过的圣诞树&#xff0c;分享给大家&#xff0c;希望可以帮助到大家度过一个浪漫的圣诞节~ Python打造专属于你的圣诞树落叶雪花背景音乐浪漫弹窗 五合一版圣诞树 一、背景故事圣诞节风波❤️❤️❤️ 二、五…

针对海量数据的存储与访问瓶颈的解决方案

背景 在当今这个时代&#xff0c;人们对互联网的依赖程度非常高&#xff0c;也因此产生了大量的数据&#xff0c;企业视这些数据为瑰宝。而这些被视为瑰宝的数据为我们的系统带来了很大的烦恼。这些海量数据的存储与访问成为了系统设计与使用的瓶颈&#xff0c;而这些数据往往存…

内网BUG管理系统本地部署并结合内网穿透实现异地远程访问

文章目录 前言1. 本地安装配置BUG管理系统2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射本地服务3. 测试公网远程访问4. 配置固定二级子域名4.1 保留一个二级子域名5.1 配置二级子域名6. 使用固定二级子域名远程 前言 BUG管理软件,作为软件测试工程师的必备工具之一。在…

Windows如何安装使用TortoiseSVN客户端并实现公网访问本地SVN Server

文章目录 前言1. TortoiseSVN 客户端下载安装2. 创建检出文件夹3. 创建与提交文件4. 公网访问测试 前言 TortoiseSVN是一个开源的版本控制系统&#xff0c;它与Apache Subversion&#xff08;SVN&#xff09;集成在一起&#xff0c;提供了一个用户友好的界面&#xff0c;方便用…

泛型深入理解

泛型的概述 泛型&#xff1a;是JDK5中引入的特性&#xff0c;可以在编译阶段约束操作的数据类型&#xff0c;并进行检查。 泛型的格式&#xff1a;<数据类型>; 注意&#xff1a;泛型只能支持引用数据类型。 集合体系的全部接口和实现类都是支持泛型的使用的。 泛型的…

周周清(3)

周一&#xff1a; 写了一道算法题&#xff0c;然后由于身体原因&#xff0c;在宿舍休息了很久&#xff1b;然后还是完成了一道算法题&#xff1a;写了一道LRC缓存题&#xff0c;之前就开始写了&#xff0c;写了很久&#xff0c;每次都开始动笔&#xff0c;刚开始用的是队列加m…