当前位置: 首页 > news >正文

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;

部分手动:

1set autocommit = false; 到关闭连接或者到set autocommit = true;之间全部是手动
2start 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.需求 抽奖活动 新用户注册即参与抽奖&#xff0c;奖品为&#xff1a;1.优惠券&#xff0c;2.优酷会员&#xff0c;3.京东卡 2.无模式 public class FreeGoodsController{public Result<?> send(AwardInfo awardInfo){int awardType awardInfo.getAward…...

PCB设计中降低噪声与电磁干扰的24个窍门

电子设备的灵敏度越来越高&#xff0c;这要求设备的抗干扰能力也越来越强&#xff0c;因此PCB设计也变得更加困难&#xff0c;如何提高PCB的抗干扰能力成为众多工程师们关注的重点问题之一。本文将介绍PCB设计中降低噪声与电磁干扰的一些小窍门。 下面是经过多年设计总结出来的…...

设计模式浅谈

什么是设计模式 设计模式是一种软件设计的思想。是在软件开发过程中&#xff0c;经过验证的、用于解决在特定环境下重复出现的、特定问题的解决方案。 设计模式的设计原则 原文链接&#xff1a;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年以来&#xff0c;Alphabet&#xff08;Google&#xff09;已进行了200多次并购。下面列出了并购年份。选择Alphabet进行的三笔并购讨论这些并购是如何使Alphabet拥有新的或增强的现有业务领域重要的是考虑何时进行所选择的收购。谷歌已经从一家提供互联网搜索引擎的公司…...

gcc/g++、动静态库、make/makefile

目录 gcc/g gcc和g的对比 "一段代码的使命" ●预处理 ●编译 ●汇编 ●链接 ●动/静态链接 make/makefile gcc/g gcc和g的对比 对于c文件而言&#xff0c;使用gcc或者g并没有什么区别。而对于cpp文件&#xff0c;在预处理、编译、汇编这三部分&#xff0c;…...

北京博奥智源,浅谈图书馆的馆情展示系统细则

功能特点&#xff1a; 1、支持智慧大屏的定制&#xff0c;内置精美的主题模板。 2、提供丰富的数据模块&#xff0c;可通过拖拽自由组合&#xff0c;配置灵活。 3、支持屏幕分辨率自定义&#xff0c;自适应屏幕大小。 4、支持背景颜色的更换&#xff0c;同时可上传图片更换背景…...

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&#xff08;“engine x”&#xff09;一个具有高性能的【HTTP】和【反向代理】的【WEB服务器】&#xff0c;同时也是一个【POP3/SMTP/IMAP代理服务器】&#xff0c;是由伊戈尔赛索耶夫(俄罗斯人)使用C语言编写的&#xff0c;Nginx的第一个版本是200…...

跳跃游戏II-力扣45-java 动态规划

一、题目描述给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处:0 < j < nums[i] i j < n返回到达 nums[n - …...

【算法】用python代码解决“鬼谷问徒”问题

文章目录题目相关链接算法代码代码可优化的点喜欢这种搞逻辑的题目。据说chatGPT暂时还不会写hhh。水平有限&#xff0c;我自己花了两个小时才实现&#xff0c;不过解决问题的过程还是很快乐的。题目 一天&#xff0c;鬼谷子随意从2-99中选取了两个数。他把这两个数的和告诉了…...

【1】linux命令每日分享——mkdir创建目录

大家好&#xff0c;这里是sdust-vrlab&#xff0c;Linux是一种免费使用和自由传播的类UNIX操作系统&#xff0c;Linux的基本思想有两点&#xff1a;一切都是文件&#xff1b;每个文件都有确定的用途&#xff1b;linux涉及到IT行业的方方面面&#xff0c;在我们日常的学习中&…...

TPM 2.0实例探索1

1. 获取用户名 命令及结果如下所示&#xff1a; $ whoami ph2. 获取设备序列号&#xff08;串号&#xff09; 命令及结果如下所示&#xff1a; $ sudo dmidecode | grep "Serial Number" | head -n 1Serial Number: MP260S483. 将用户名和设备序列号放入到一个文…...

buu [BJDCTF2020]signin 1

题目描述&#xff1a; 题目分析&#xff1a; 打开发现是16 进制数&#xff08;我也不知道我是怎么发现的&#xff0c;先是尝试了md5和rot-n,发现都不行&#xff0c;然后参考大佬的才知道是16进制&#xff09;使用 在线16进制转字符串 便能得到 flag但我如果不想用线上工具&…...

Storage

WebStorage主要提供了一种机制&#xff0c;可以让浏览器提供一种比cookie更直观的key、value存储方式&#xff1a; localStorage&#xff1a;本地存储&#xff0c;提供的是一种永久性的存储方法&#xff0c;在关闭掉网页重新打开时&#xff0c;存储的内容依然保留&#xff1b;…...

CAS底层原理及ABA问题

一、案例CAS是Java中Unsafe类里面的一个方法&#xff0c;它的全称是叫CompareAndSwap比较并交换的一个意思&#xff0c;它的主要功能是能够去保证在多线程的环境下对于共享变量修改的一个原子性。例如&#xff0c;比如说像这样一个场景&#xff0c;有一个成员变量state&#xf…...

华为OD机试真题Python实现【单词反转】真题+解题思路+代码(20222023)

题目 输入一个英文文章片段, 翻转指定区域的单词顺序, 标点符号和普通字母一样处理, 例如输入字符串 I am a developer. [0,3] 则输出 developer. a am I 🔥🔥🔥🔥🔥👉👉👉👉👉👉 华为OD机试(Python)真题目录汇总 输入 使用换行隔开 3 个参数 第一…...

嵌入式linux驱动学习-用cdev代替register_chrdev()

​上回说到字符设备驱动程序的注册与销毁register_chrdev()和unregister_chrdev()这是有缺陷的。 嵌入式lnux驱动学习-2.一个驱动程序的流程 现在用另外一个更好的方法代替&#xff0c;我们先来看看register_chrdev()实际上是调用了 __register_chrdev(major, 0, 256, name,…...

技术更新!10个MySQL性能调优技巧

MySQL是世界上使用最广泛的开源数据库&#xff0c;它在业界的受欢迎程度让其他数据库望尘莫及。它是一个关系型数据库管理系统&#xff0c;多年来依然是应用程序的核心。在过去几年里&#xff0c;MySQL有一些重要发展。因此&#xff0c;整理更新10个MySQL性能调优技巧。 模式设…...

ICLR 2023|VLDet:从图像-文本对中学习区域-词语对齐的开放词汇式目标检测

原文链接&#xff1a;https://www.techbeat.net/article-info?id4614&isPreview1 作者&#xff1a;林闯 目标检测任务在AI工业界具有非常广泛的应用&#xff0c;但由于数据获取和标注的昂贵&#xff0c;检测的目标一直被限制在预先设定好的有限类别上。而在学术界&#xf…...

如何效率搭建企业流程系统?试试低代码平台吧

编者按&#xff1a;本文介绍了一款可私有化部署的低代码平台&#xff0c;可用于搭建团队流程管理体系&#xff0c;并详细介绍了该平台可实现的流程管理功能。关键词:可视化设计&#xff0c;集成能力&#xff0c;流程审批&#xff0c;流程调试天翎是国内最早从事快速开发平台研发…...

嵌入式开发:C++在深度嵌入式系统中的应用

深度嵌入式系统通常在C语言中实现。为什么会这样?这样的系统是否也能从C中获益?嵌入式开发人员在将广泛、高效的深度嵌入式代码库从C转换为C方面的实践经验的贡献。嵌入式和深度嵌入式系统通常用C而不是C实现。软件开发人员必须放弃C作为强类型系统、模板元编程(TMP)和面向对…...

快鲸scrm发布快递行业私域运营解决方案

现如今&#xff0c;快递行业竞争格局日益激烈&#xff0c;前有“四通一达”等传统快递企业&#xff0c;后有自带互联网基因、绑定电商流量新贵快递企业&#xff0c;如菜鸟、京东等。在这一背景下&#xff0c;很多快递企业开启了增长破局之旅&#xff0c;他们纷纷搭建起私域运营…...

【蓝桥杯集训·每日一题】AcWing 1497. 树的遍历

文章目录一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解三、知识风暴递归一、题目 1、原题链接 1497. 树的遍历 2、题目描述 一个二叉树&#xff0c;树中每个节点的权值互不相同。 现在给出它的后序遍历和中序遍历&#xff0c;请你输出它的 …...

详解matplotlib的color配置

详解matplotlib的color配置 Matplotlib可识别的color格式 格式举例RGB或RGBA&#xff0c;由[0, 1]之间的浮点数组成的元组&#xff0c;分别代表红色、绿色、蓝色和透明度(0.1, 0.2, 0.5), (0.1, 0.2, 0.5, 0.3不区分大小写的十六进制RGB或RGBA字符串。‘#0f0f0f’, ‘#0f0f0f…...