2023面试准备之--mysql

news2025/2/27 21:40:17

文章目录

  • 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了额外的数据,可能是查询了多余的行并且抛弃掉了,可能是加载了许多结果中并不需要的列,对语句进行分析以及重写。
  • 分析语句的执行计划,然后获得其使用索引的情况,之后修改语句或者修改索引,使得语句可以尽可能的命中索引
  • 如果对语句的优化已经无法进行,可以考虑表中的数据量是否太大,如果是的话可以进行横向或者纵向的分表

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

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

相关文章

1.3 Spring Boot 框架集成Knife4j(官网)

1.3 Spring Boot 框架集成Knife4j&#xff08;官网&#xff09; 本次示例使用Spring Boot作为脚手架来快速集成Knife4j,Spring Boot版本2.3.5.RELEASE,Knife4j版本2.0.7&#xff0c;完整代码可以去参考knife4j-spring-boot-fast-demo pom.xml完整文件代码如下 <?xml ver…

性能测试的二八原则

性能测试二八原则&#xff0c;响应时间2/5/8原则 所谓响应时间的“2-5-8原则”&#xff0c;简单说&#xff0c;就是 当用户能够在2秒以内得到响应时&#xff0c;会感觉系统的响应很快; 当用户在2-5秒之间得到响应时&#xff0c;会感觉系统的响应速度还可以; 当用户在5-8秒以内得…

电路模型和电路定律——“电路分析”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰的内容是我这学期的专业课噢&#xff0c;首先就学习了电路模型和电路定律&#xff0c;包括电路和电路模型、电流和电压的参考方向、电功率和能量、电路元件、电阻元件、电压源和电流源、基尔霍夫定律。那么现在&#xff0c;就让我…

FastReport .NET 2023.1.13 Crack

FastReport .NET 使用来自 ADO .NET 数据源的数据。它可以排序和过滤数据行&#xff0c;使用主从关系和查找数据列。一切都可以通过点击几下鼠标来完成。 直接连接到 ADO、MS SQL 或基于 xml 的数据库。其他连接器可作为插件使用。 能够从 IEnumerable 类型的业务对象中获取数…

hadoop入门介绍及各组件功能运行关系

文章目录Hadoop 组成部分1.HDFS2.MapReduce 架构概述3. yarn 架构概述4.HDFS、YARN、MapReduce三者关系Hadoop 组成部分 1.HDFS Hadoop Distributed File System&#xff0c;简称 HDFS&#xff0c;是一个分布式文件系统。 HDFS 架构概述 主要分为 NameNode (mn):存储文件的元…

SQL高级 --优化

一、SQL查询的解析 关联查询过多索引失效&#xff08;单值、符合&#xff09; 二、mysql explain使用简介 1、关于id的说明&#xff1a; 2 、select_type 常见和常用的值有如下几种&#xff1a; 分别用来表示查询的类型&#xff0c;主要是用于区别普通查询、联合查询、子…

Java常用框架(二)

三、Netty 1.概述 1.1 为什么要选Netty? 使用Netty不必编写复杂的逻辑代码去实现通信&#xff0c;再也不需要去考虑性能问题&#xff0c;不需要考虑编码问题&#xff0c;半包读写等问题。Netty是最流行的NIO框架&#xff0c;它的健壮性、功能、性能、可定制性和可扩展性在同…

关于android中有关JNI无法生成.so文件的问题解决方法

问题&#xff1a;在配置NDK开发环境时&#xff0c;会发现无法正常生成so文件的情况&#xff0c;可能时AS本身的bug&#xff0c;这时候提供一种方法手动生成so文件 一 配置NDK 1.1 在File | Settings | Appearance & Behavior | System Settings | Android SDK | SDK Tool…

【Linux】常用命令大全(二)

目录 4. Linux常用命令 4.1 Linux命令初体验 4.2 文件目录操作命令 4.3 拷贝移动命令 4.4 打包压缩命令 4.5 文本编辑命令 4.6 查找命令 4. Linux常用命令 4.1 Linux命令初体验 4.1.1 常用命令演示 在这一部分中&#xff0c;我们主要介绍几个常用的命令&#xff0c…

深度学习基础训练流程

深度学习基础训练流程 前言 本文只是本人学习笔记记录&#xff0c;文中部分图片来源网络&#xff0c;如有侵权请联系我进行删除 1、深度学习基础 1.1 深度学习 深度学习是机器学习的一个分支&#xff0c;目的是找到一组良好的参数θ&#xff0c;使得θ表示的数学模型能够很…

K8S多节点二进制部署

目录 一、多 Maser 集群架构的了解 二、master2 节点部署 1、从 master01 节点上拷贝证书文件、各master组件的配置文件和服务管理文件到 master02 节点 2、修改配置文件kube-apiserver中的IP 3、在 master02 节点上启动各服务并设置开机自启 4、查看node节点状态 三、负…

1-MATLAB APP Design-图像的输入与输出

一、APP 界面设计展示 新建一个空白的APP,在此次的学习中,我们会用到编辑字段(文本框)、 按钮、坐标区和面板,首先在界面中拖入一个编辑字段(文本框),在文本框中输入内容:图形的输入与输出,调整背景颜色,字体的颜色为黑色,字体的大小调为25.

开通腾讯位置服务

文章目录一、开通腾讯位置服务步骤二、腾讯位置服务SDK三、小程序项目中&#xff0c;创建 lib 目录&#xff0c;把SDK文件放入其中一、开通腾讯位置服务步骤 因为签到流程中要获取用户当前所在地址的信息&#xff0c;所以需要把定位坐标缓存成地址&#xff0c;恰好腾讯位置服务…

【 java 8】Lambda 表达式

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

MySQL 性能优化思路和工具

MySQL 性能优化思路和工具 一、优化思路 作为架构师或者开发人员&#xff0c;说到数据库性能优化&#xff0c;你的思路是什么样的&#xff1f; 或者具体一点&#xff0c;如果在面试的时候遇到这个问题&#xff1a;你会从哪些维度来优化数据库&#xff0c;你会怎么回答&#x…

Hive内部表与外部表的区别具体说明

目录 1.在/opt/atguigu/目录下&#xff0c;新建两个txt文件 2.在hadoop的web端递归创建一个目录&#xff0c;存储这两个文件 3.查看web端的文件 一、内部表&#xff1a; 1.创建一个内部表&#xff0c;并指定内部表的存储位置 2.查看内部表&#xff0c;内部表中没有数据 …

技术学习-消息队列

什么是消息队列 可以简单理解为存放消息的队列&#xff0c;数据结构模型和队列一样&#xff0c;都是先进先出。主要用不同线程(Thread)/进程(Process) 为什么需要消息队列 (1)不同进程之间传递消息是&#xff0c;因为进程的耦合度高&#xff0c;改动一个进程&#xff0c;引发…

基于SVPWM改进的永磁同步电机直接转矩控制二更

导读&#xff1a;本期对基于SVPWM的永磁同步电机直接转矩控制进行全面的分析和仿真搭建。之后与传统的DTC进行比较&#xff0c;凸显基于SVPWM改进的DTC方法的有效性。如果需要文中的仿真模型&#xff0c;关注微信公众号&#xff1a;浅谈电机控制&#xff0c;留言获取。一、 传统…

Long型数据后端查询结果为null,返回前端显示-1,使用@JsonSerialize注解

使用场景 在开发中&#xff0c;我们将对象序列化为JSON传输给前端&#xff0c;有时候我们的某个或者某些字段需要特殊处理&#xff0c;比如我们有一个日期字段&#xff0c;我们希望当日期为NULL时给前端不返回NULL而返回为未完成等信息&#xff0c;或者我们有一些状态字段&…

达梦数据库(DM8)集成使用 Geoserver(2.22.2) 以及其他对应版本详解

达梦数据库&#xff08;DM8&#xff09;集成使用 Geoserver&#xff08;2.22.2&#xff09; 以及其他对应版本详解系统环境版本Geoserver 驱动对应版本达梦 8 集成 Geoserver 过程试错过程问题总结项目需要国产化&#xff0c;选择使用达梦数据库&#xff0c;在技术测试阶段&…