2023面试准备之--mysql
文章目录
- mysql
- 存储引擎
- 索引
- 聚簇索引和非聚簇索引
- 事务
- 锁
- MVCC机制(类似于copy on write)
- 主从复制
- 为什么要主从同步?
- 怎么处理mysql的慢查询?
mysql
clint ---->server ----> 存储引擎
存储引擎
- Innodb
- 是MySQL5.5版本及之后默认的存储引擎,存储数据更加安全
- 支持自适应哈希(自己决定是hash还是B+)
- 一定有聚簇索引,但是其他索引都是非聚簇索引
- myisam
- 是MySQL5.5版本之前默认的存储引擎
- 速度比Innode更快
- 只有非聚簇索引
- memory
- 内存引擎(数据全部存放在内存中)断电数据丢失
- 支持的是hash索引
- blackhole
- 无论存什么,都立刻消失(黑洞)
索引
- 基础知识补充
操作系统
局部性原理:时间:之前被访问过的数据很有可能再次被访问空间:数据和程序都有聚集成群的倾向
磁盘预读:内存跟磁盘在进行交互的时候有一个最小的逻辑单位,这个单位称之为页,或者datapage,一般是4k或者8k,由操作系统系统决定,我们在进行数据的读取的时候,一般会读取页的整数倍,4k、8k、16k, innodb存储引擎在进行数据加载的时候读区的是16kb的数据。
分块读取:可以理解为是磁盘预读
- 分类:
- 普通索引:允许被索引的数据列包含重复的值。
- 唯一索引:可以保证数据记录的唯一性。
- 主键索引:是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯一标识记录,使用关键字primary key来创建
- 联合索引:索引可以覆盖多个数据列
- 全文索引:通过建立倒排索引,可以极大的提升检索效率,解决判断字段是否包含的问题,是目前搜索引擎使用的一招难过关键技术。
- 优缺点:
- 索引可以极大的提高数据的查询速度,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能,但是会降低插入、删除、更新表的速度,因为在执行这些写操作的时候,还要操作索引文件,索引需要占用物理空间,除了数据表占用空间外,每一个索引还要占用物理空间,如果要建立聚簇索引,那么需要的空间会更大,如果非聚簇索引很多,一旦聚簇索引发生改变,那么所有的非聚簇索引都要跟着变。
- 索引的设计原则?
- 应该保证索引字段占用的空间越小越好
- 适合索引的列是出现在where字段中的列,或者连接字句中指定的列
- 基数较小的表,索引效果差,没必要创建索引。
- 选择列的时候,越短越好,可以指定某些列的一部分,没必要用全部字段的值。
- 不要给每一个字段都创建索引,并不是索引越多越好
- 定义有外键的数据列一定要创建索引
- 更新频繁的字段不要有索引
- 创建索引的列不要太多,可以创建组合索引,但是组合索引的列的个数不建议太多
- 大文本、大对象不要创建索引
- 用途:提高查询效率,索引和实际的数据都是存储在磁盘上的,只不过在进行数据读取的时候会优先把索引加载到内存中。
- 如何索引太大如何读区到内存中?
- 分块读取,分而治之
- 性能消耗主要是io问题,如何解决? 1是减少io量,2是减少io次数。
- 什么格式的数据?
- k -v ——> 数据结构——> hash/树。–》最终选择的是B+树, 为什么?
- 为什么不用hash: 需要比较好的hash算法,如果算法不好的话,会导致hash碰撞,hash冲突,导致数据散列不均匀,当需要进行范查找的时候需要挨个遍历,效率比较低。
- 为什么不用二叉树、BST、AVL、红黑树:当需要向这些树插入更多的数据的时候,会导致当前树变得非常高,加大读取次数(每次查找都是io操作,io操作降低性能),影响查询速度
- 所以B树是

- B+树:所以一般3到4层的B+树足以支撑千万级别的数据存储。

- 选择索引的时候,选择int还是varchar?key要尽可能少的占用空间。
- 前缀索引:根据统计唯一值来确定前缀索引的长度。
聚簇索引和非聚簇索引
- 数据跟索引存储在一起的叫聚簇索引,没有存储在一起的叫非聚簇索引。
- innodb存储引擎在进行数据插入的时候,数据必须和某一个索引存储在一起,这个索引列可以是主键,如果没有主键,选择唯一键,如果没有唯一键,选择6字节的rowid来进行存储。此时数据必定是跟某一个索引绑定在一起的,绑定数据的索引叫做聚簇索引。其他索引的叶子节点中存储的数据不再是整行的记录,而是聚簇索引的id值。
- innodb:中既有聚簇索引也有非聚簇索引
- myisam:只有非聚簇索引
- 回表:
id,name, age, gender
id主键, name普通索引
select*from table where name='zhangsan';
先根据nameB+树匹配到对应的叶子节点, 查询到对应行记录的id值,再根据id值去id的B+树中检索整行的记录,这个过程就称之为回表,要尽量避免回表的操作,从非聚簇索引跳转到聚簇索引的过程称之为回表。
- 索引覆盖:
id,name, age, gender
id主键, name普通索引
select id,name from table where name='zhangsan';
当非聚簇索引的的叶子节点中包含了查询需要的字段的时候,不需要回表,这个过程称之为索引覆盖
- 最左匹配:
id,name, age, gender
id主键, name、age普通索引组合索引
select * from table where name='zhangsan' and age=18;#不失效
select * from table where name='zhangsan';#不失效
select * from table where age=18;#失效
select * from table where age=18 and name='zhangsan';#不失效,因为有内部优化器,会优化代码。
最左匹配原则就是组合索引的时候要有顺序,否则索引失效。
**当表中的全部列都是索引列的时候,无论怎么查询都会用到索引**
- 索引下推:
id,name, age, gender
id主键, name、age普通索引组合索引
select * from table where name='zhangsan' and age=18;
在没有索引下推之前,执行的过程是,先根据name从存储引擎中拉去数据,然后根据age在server中过滤
有了索引下推之后,执行的过程是根据name、age整体的从存储引擎中做数据检索,返回对应的记录,不在server层做任何操作。
将检索数据从server层推到了存储引擎层叫索引下推。
事务
- 定义:一组操作要么全部成功,要么全部失败,目的是为了保证数据最终的一致性。mysql默认情况下,自动提交事务
set autocommit = false;
提交:commit;
回滚:rollback;
部分手动:
1、set autocommit = false; 到关闭连接或者到set autocommit = true;之间全部是手动
2、start transaaction; 中间全部是手动 提交:commit;或回滚:rollback;
- 特性ACID:
- 原子性(Atomicity):当前事务的操作要么同时成功,要么同时失败,是由我们的undo log日志来保证。
- 一致性(Consistency):使用事物的最终目的,由业务代码正确逻辑保证。
- 隔离性(Isolation):在事物并发执行时,他们内部的操作不能互相干扰。
- 持久性(Durability):
- 数据库的隔离级别:级别越高事务隔离性越好,但性能越低,而隔离机制是由mysql的各种锁以及MVCC机制来实现的
- read uncommit(读未提交):有脏读问题
- read commit(读已提交):有不可重复读问题
- repeatable read(可重复读):有幻读问题
- serializable(串行):解决上面全部问题
锁
- 乐观锁:增加版本号id
- 悲观锁:
- 按照属性分类:
- 共享锁:又称读锁,当一个事务为数据加上锁以后,其他事务只能对数据加读锁,不能写,作用是为了支持并发数据的读取,读数据的时候不支持修改,避免出现重复读的问题。
- 排他锁:又称写锁,当一个事务加上写锁时候,其他请求不能加任何锁,直到该锁释放,目的是为了在数据修改的时候,不许其他人同时修改,也不许其他人读取,避免出现脏数据和脏读的问题。
- 按照锁的粒度分类:
- 表级锁:锁住整个表,当下一个事务访问的时候,必须等前一个事务释放了锁才能对表访问,特点:粒度大,加锁简单,容易冲突
- 行级锁(innodb):锁住某一行或者多行,其他事务访问这个表的时候可以访问其他行,特点:粒度小,加锁麻烦,不容易冲突,相比表锁支持的并发要高。
- 记录锁:是行锁的一种,只锁住一行
- 页级锁:介于行锁和表锁之间
- 间歇锁:行锁的一种,表中的某一个空间,当表的相邻id之间出现空隙,就会形成一个空间,左开右闭。
- 临键锁:间隙锁和记录锁一起,就是左闭右闭。
MVCC机制(类似于copy on write)
- 定义:多版本并发控制,就可以做到读写不堵塞,且避免了类似脏读问题。主要通过undo日志链来实现

主从复制

- 过程描述
- master服务器将数据改变记录到二进制binlog里面,当master上的数据发生改变的时候,则将其改变写入二进制的日志中
- slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变则开始一个I/OThread请求master二进制事件。
- 同时主节点为每个I/O线程启动一个dump线程,发送二进制事件并保存到本地的relay日志中,从节点将启动SQL线程读取二进制文件,在本地重放,使得其数据与主节点保持一致,最后I/OThread和SQLThread将进入休眠状态,等待下一次被唤醒。
- 过程简单描述:
- 从库会生成两个线程,I/OThread和SQLThread
- I/OThread会去请求主库的binlog,并将得到的binlog写到本地的relay-log(中继日志)中
- 主库会生成一个log dump线程,用来给从库I/O线程传binlog
- SQL线程会读取relay-log文件中的日志,并解析成sql语句逐一执行。

为什么要主从同步?
- 在复杂的业务系统中,如果有一条sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让从库负责读,就可以保证业务的正常运行了。
- 做数据的热备(主备:当业务激增的时候,可以正常访问)
- 架构的扩展,业务量越大,I/O访问频率越高,单机无法满足,此时做多库的存储,降低磁盘I/O的频率,提高单个机器的I/O性能。(当数据库超过千万级别的时候就要做到分库分表)
怎么处理mysql的慢查询?
- 开启慢查询日志,准确定位到哪个sql语句出现了问题
- 分析sql语句,看看是否load了额外的数据,可能是查询了多余的行并且抛弃掉了,可能是加载了许多结果中并不需要的列,对语句进行分析以及重写。
- 分析语句的执行计划,然后获得其使用索引的情况,之后修改语句或者修改索引,使得语句可以尽可能的命中索引
- 如果对语句的优化已经无法进行,可以考虑表中的数据量是否太大,如果是的话可以进行横向或者纵向的分表
相关文章:
2023面试准备之--mysql
文章目录mysql存储引擎索引聚簇索引和非聚簇索引事务锁MVCC机制(类似于copy on write)主从复制为什么要主从同步?怎么处理mysql的慢查询?mysql clint ---->server ----> 存储引擎 存储引擎 Innodb 是MySQL5.5版本及之后默…...
yolov5源码解读--训练策略
yolov5源码解读--训练策略超参数解读命令行参数train模型迭代超参数解读 hyp.scratch.yaml lr0: 0.0032 初始学习率 lrf: 0.12 使用余弦函数动态降低学习率(lr0*lrf) momentum: 0.843 动量 weight_decay: 0.00036 权重衰减项 warmup_epochs: 2.0 预热(…...
基于Django的员工管理系统
目录 一、新建项目 二、创建app 三、设计表结构 四、在MySQL中生成表 五、静态文件管理 六、添加页面 七、模板的继承 一、新建项目 django-admin startproject 员工管理系统 二、创建app startapp app01 三、设计表结构 app01/migrations/models.py from django.db impo…...
企业数智化转型在即,看看低代码软件公司如何做!
在信息爆炸的现代社会中,利用先进技术为企业提升办公协作效率,是一件事半功倍的事。当前,数字化转型升级已经是发展趋势,不少企业已经在朝着数智化转型方向迈进。作为一家低代码软件公司,流辰信息看到了市场发展前景&a…...
如何将pdf版的文书文字提取出来?
//在线工具地址https://ocr.bytedance.zj.cn/image/ImageText在当今信息爆炸的时代,图文并茂已经成为了一个广告宣传的常用方式。然而,图片中的文字信息往往难以获取,尤其对于那些需要快速获取信息的人们来说,阅读图片中的文字会是…...
设计模式——工厂模式
工厂模式 1.需求 抽奖活动 新用户注册即参与抽奖,奖品为:1.优惠券,2.优酷会员,3.京东卡 2.无模式 public class FreeGoodsController{public Result<?> send(AwardInfo awardInfo){int awardType awardInfo.getAward…...
PCB设计中降低噪声与电磁干扰的24个窍门
电子设备的灵敏度越来越高,这要求设备的抗干扰能力也越来越强,因此PCB设计也变得更加困难,如何提高PCB的抗干扰能力成为众多工程师们关注的重点问题之一。本文将介绍PCB设计中降低噪声与电磁干扰的一些小窍门。 下面是经过多年设计总结出来的…...
设计模式浅谈
什么是设计模式 设计模式是一种软件设计的思想。是在软件开发过程中,经过验证的、用于解决在特定环境下重复出现的、特定问题的解决方案。 设计模式的设计原则 原文链接:https://blog.csdn.net/qq_43471489/article/details/124067150 设计原则 1、…...
【kubernetes】使用crictl对k8s节点进行调试
crictl 是 CRI 兼容的容器运行时命令行接口,可以使用它来检查和调试 Kubernetes 节点上的容器运行时和应用程序。 可以Github上下载最新的发布版本: https://github.com/kubernetes-sigs/cri-tools/releases 包名大小发布日期...
数字经济讨论题
自2001年以来,Alphabet(Google)已进行了200多次并购。下面列出了并购年份。选择Alphabet进行的三笔并购讨论这些并购是如何使Alphabet拥有新的或增强的现有业务领域重要的是考虑何时进行所选择的收购。谷歌已经从一家提供互联网搜索引擎的公司…...
gcc/g++、动静态库、make/makefile
目录 gcc/g gcc和g的对比 "一段代码的使命" ●预处理 ●编译 ●汇编 ●链接 ●动/静态链接 make/makefile gcc/g gcc和g的对比 对于c文件而言,使用gcc或者g并没有什么区别。而对于cpp文件,在预处理、编译、汇编这三部分,…...
北京博奥智源,浅谈图书馆的馆情展示系统细则
功能特点: 1、支持智慧大屏的定制,内置精美的主题模板。 2、提供丰富的数据模块,可通过拖拽自由组合,配置灵活。 3、支持屏幕分辨率自定义,自适应屏幕大小。 4、支持背景颜色的更换,同时可上传图片更换背景…...
Docker----------day-mysql8主从复制
1.安装master 1.1拉取镜像 docker search mysql docker pull mysql mkdir -p /home/mysql8/data mkdir -p /home/mysql8/conf mkdir -p /home/mysql8/log1.2 2.启动交互式添加容器数据卷 #不添加容器数据卷 docker run -p 3307:3306 --name mysql_master -e MYSQL_ROOT_PASS…...
【Nginx】【一】Nginx简介
Nginx简介 背景介绍 Nginx(“engine x”)一个具有高性能的【HTTP】和【反向代理】的【WEB服务器】,同时也是一个【POP3/SMTP/IMAP代理服务器】,是由伊戈尔赛索耶夫(俄罗斯人)使用C语言编写的,Nginx的第一个版本是200…...
跳跃游戏II-力扣45-java 动态规划
一、题目描述给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i j] 处:0 < j < nums[i] i j < n返回到达 nums[n - …...
【算法】用python代码解决“鬼谷问徒”问题
文章目录题目相关链接算法代码代码可优化的点喜欢这种搞逻辑的题目。据说chatGPT暂时还不会写hhh。水平有限,我自己花了两个小时才实现,不过解决问题的过程还是很快乐的。题目 一天,鬼谷子随意从2-99中选取了两个数。他把这两个数的和告诉了…...
【1】linux命令每日分享——mkdir创建目录
大家好,这里是sdust-vrlab,Linux是一种免费使用和自由传播的类UNIX操作系统,Linux的基本思想有两点:一切都是文件;每个文件都有确定的用途;linux涉及到IT行业的方方面面,在我们日常的学习中&…...
TPM 2.0实例探索1
1. 获取用户名 命令及结果如下所示: $ whoami ph2. 获取设备序列号(串号) 命令及结果如下所示: $ sudo dmidecode | grep "Serial Number" | head -n 1Serial Number: MP260S483. 将用户名和设备序列号放入到一个文…...
buu [BJDCTF2020]signin 1
题目描述: 题目分析: 打开发现是16 进制数(我也不知道我是怎么发现的,先是尝试了md5和rot-n,发现都不行,然后参考大佬的才知道是16进制)使用 在线16进制转字符串 便能得到 flag但我如果不想用线上工具&…...
Storage
WebStorage主要提供了一种机制,可以让浏览器提供一种比cookie更直观的key、value存储方式: localStorage:本地存储,提供的是一种永久性的存储方法,在关闭掉网页重新打开时,存储的内容依然保留;…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
