总结的一些MySql面试题

目录

一:基础篇

二:索引原理和SQL优化

三:事务原理

四:缓存策略


一:基础篇

1:定义:按照数据结构来组织、存储和管理数据的仓库;是一个长期存储在计算机内的、有组织的、可共享 的、统一管理的大量数据的集合;

2:MySql中含有内部连接池用来管理缓冲用户的连接,以及线程处理需要缓存的需要。并且使用IO多路复用的select + 阻塞IO。并且他的命令处理是在多线程中并发处理的。

3:数据库三范式:先保持原子性不可分割 / 确保表中的每列和主键完全依赖 / 确保每列和主键直接相关不是间接相关。但是有时候没有必要使用三范式,会导致数据库业务涉及到的表变多,造成更多的连表查询,导致整个性能降低。因此需要考虑反范式。

4:五大约束:非空约束,自增约束,唯一约束,主键约束包括非空且唯一,外键约束。其中外键约束在 innodb 中支持,并且满足事务。

5:删除数据

drop(DDL):速度快,删除整张表结构和表数据,包括索引,约束,触发器等。但是删除后不能回滚,会进行释放空间。

truncate(DDL):速度比较快,会删除表数据,其他字段会保留(自增字段置为1),但是也不能回滚,会释放空间,以页单位进行删除。

delete(DML):速度慢,删除部分字段或者全部字段,其他保留,他是一个条件删除,可以进行回滚,是标记删除(实际并未删除),可以进行逐行删除。

6:去重是group by ,select distinct 。条件判断是:where,group by ... having , ...join ... on ... 。三种

7:视图:视图是逻辑表,自身不含数据,内容是通过查询得到。安全:使用视图,用户只能看到他们被允许查询到的结果集,而对表的权限管理无法做到限制某些行和列,视图却可以。数据独立,源表中的数据修改,对视图没有影响。视图可以减少重复语句的书写,并且还是个重构利器:如果需要将一个表进行拆分成两个表,我们可以使用视图来进行操作,创建出两个视图,这样我们只需要更改数据库结构,而不用修改应用程序。

8:触发器:触发器的执行是由事件自动触发,而不是程序调用和手工启动。比如当DML操作的时候,就会激活执行。

二:索引原理和SQL优化

MySql索引原理和SQL优化_mysql 全文索引sql-CSDN博客

1:索引是什么:索引是一种有序的存储结构,它将单个或多个列的值进行排序。

2:索引分类:主键索引,唯一索引,非空索引,普通索引,组合索引,全文索引。在主键索引的B+数种中包含数据的全部信息。全文索引是将存储在数据库中的整本书整篇文章的任意内容信息查找。关键词是:FULLTEXT。

3:为什么使用B+数索引,而不使用红黑树结构?

        首先B+数相对于高瘦的红黑树来说,B+树是胖矮的,在叶子节点中存放数据,并且叶子节点还串联在一起,而非叶子节点中存放索引信息。无论是叶子节点还是非叶子节点都是存放在页中的。这样当我们查找数据的时候,我们会拥有更少的磁盘IO,而且更方便范围查找,因为叶子节点是串联在一起的,找到第一个叶子节点后,可以相继找出其他节点。但是对于红黑树来说,需要不断进行搜索。并且每个索引都对应一个B+树。

为什么采用多路的树结构?一个节点有多条链路,相较于平衡二叉搜索树是一个更加矮胖的结构,树的高度更低,可以较少的磁盘io次数来索引数据。

为什么非叶子节点只存储索引信息?B+树节点映射固定的大小磁盘数据,可以包含更多的索引信息。能快速锁定数据所在叶子节点的位置。

为什么叶子节点依次相连?便于范围查询,避免中序遍历回溯回去查找下一个节点。

4:什么时候使用索引呢?

        首先我们的索引使用的位置是在where,group by ,order by 的后面使用索引。那么不适合使用索引:就是没有这一些判断条件以及区分度不高的列(数据很相似的),需要经常修改的列,表数据量少的。我们创建B+树类型的索引就是为了通过比较来找到我们所需要的数据,但是当区分度不高的时候,反而会降低速度,如果经常修改这个列,那么我们的B+的结构就要经常变化,更加影响速率,表的数据较少的时候,没有必要去创建索引,创建索引反而会浪费空间。

5:索引方式:

每一个索引都有一个B+树结构。

聚集索引:我们主键构造出的B+树,叶子节点中存放数据,数据也是索引的一部分。并且主键索引就是聚集索引,没有主键那就是唯一索引作为聚集索引。

辅助索引(二级索引):我们在辅助索引B+树中,叶子节点并不是存储的数据,而是存储的主键id。当通过辅助索引查找到主键id后,我们再根据主键去查找聚集索引。这里也叫回表查询。
覆盖索引:是索引包含了查询所需的所有列,即索引本身能够覆盖查询的字段需求,无需再通过回表操作来获取数据。通过使用覆盖索引,可以提高查询性能,减少不必要的磁盘I/O和数据传输。也就是我们不要select * 而是select 。。。什么的。
最左匹配规则:对于组合索引来说,我们使用必须要满足从左往右的规则:id,name,age。这三个只能使用:id,name,age;id,name;id;这三种方式来使用索引。

6:索引的失效和索引原则

索引失效:

1:当where  A and B 的时候,其中一个没有索引,那么就会失效。

2:当索引字段参与了运算。

3:索引字段发生隐式转换。

4:LIKE模糊匹配,通配符以“%”开头。

5:在索引字段上使用NOT <> != 

6:组合索引中,没有满足最左匹配。

索引原则:

1:查询频次较高且数据量大的表建立索引,索引选择使用频次较高,过滤效果好的列或者组合。

2:使用短索引,这样节点包含的信息多,有较少的磁盘IO操作。

3:很长的动态字符串,考虑使用前缀索引。

4:组合索引中,考虑最左匹配原则,和覆盖索引。

5:选择区分度高的列,也就是值相同的越少越好。

6:扩展索引,在现有索引的基础上,添加复合索引,最多6个索引。

7:不要select * ,尽量列出所需要的列,方便使用覆盖索引。

8:索引列尽量设置为非空

9:可以开启自适应hash索引。

三:事务原理

MySql 事务原理 - 面试_面试题 mysql事物实现原理-CSDN博客

1:事务

事务是什么:本质是一个并发的控制单元,用户定义的一个操作序列,这些操作要么都做要么都不做,满足原子操作。

什么时候使用事务:并发连接访问的时候。

事务的目的:从一种一致性状态转变成另一种一致性状态的时候,保证系统始终处于一个完整且正确的状态。

2:ACID特性中的隔离性

脏读,不可重复读,幻读。以及持久性中使用redolog写入物理日志,写入磁盘。

undolog:通过MVCC记录事务DML操作提交后产生的行数据版本信息。记录DML操作步骤,用于回滚业务,通过逆运算回滚。

redolog:事务提交后,记录DML操作对应物理页修改的内容。

3:隔离级别

read_uncommitted(读未提交):读(不做任何处理),写(自动加X锁)。脏读、不可重复读、幻读。

read_committed(读已提交)(RC):读(通过MVCC,读取最新版本的数据),写(自动加X锁)。不可重复读、幻读。

repeatable_read(可重复读)(RR):读(通过MVCC,读取开启事务前的行数据),写(自动加X锁)。幻读。

serializable(可串行化):读(自动加S锁),写(自动加X锁)。

4:隔离级别的并发异常

脏读:一个事务读到另一个未提交事务修改的数据。

不可重复读:一个事务内两次读取同一个数据不一样。一个事务提交之后,另一个事务中也会发现这个被修改的变量。

幻读:一个事务内两次读取同一个范围内的记录得到的结果集不一样,当前读和快照读不一致。我们在一个事务中插入一个数据,我们另一个事务在查询的时候并未看到这个数据,但是插入的时候发现报错。

我们数据库默认的隔离级别就是RR,也就是可以发生幻读。我们可以不用提升隔离级别就能解决这个问题,那就是手动加锁。具体加锁操作看文章即可。

5:MVCC

MVCC是多版本并发控制,保证数据的一致性和并发性。可以使多个事务在同时访问数据的时候,各自看到不同版本的数据,不会互相打扰,这样就可以避免锁和等待了。

read_view 是一个事务开始时创建的视图,他决定了事务能够看到的数据库版本中的数据版本,其中包括自身的事务id,已启动但未提交的事务id列表。

其中聚集索引记录的隐藏列存储在行中,这个行中包括该事务id。以及数据会指向之前的数据版本,用于回滚操作。

6:事务的可见性问题

事务可以看到自身事务的修改。事务之间的可见性是:已经提交的事务是可以看到的,后启动的事务是不可见的,在事务列表中已启动但未提交的不可见,已提交可见的。

7:RC和RR的区别

因为RC和RR都采用了MVCC,但是RC是读已提交,每次读取数据就会产生一个read_view。而RR是开启事务的时候才会生成一个read_view,一直用到事务结束,也就是一直能看到一个数据版本。因此RC每次读都能看到最新数据,所以产生了不可重复读,而RR中解决了。

8:什么是快照读和当前读:快照读就是从之前拍摄的一个快照中进行读取数据,而当前读就是直接读取最新数据。快照读并未采用锁,当前读加锁了。

四:缓存策略

MySQL的缓存策略_mysql 数据库的缓存策略-CSDN博客

1:MySQL 缓存方案用来干什么?

首先是MySql的缓存方案,他自己的缓存方案和业务层面是没有关系的,虽然MySQl也是用来缓存热点数据的,但是这些热点数据并不是用户自定义的,而是索引,记录等。他的缓存是从它自身出发的。

2:redis缓存方案:redis是内存数据库读取速度十分快,因此我们采用redis作为我们的缓冲数据库,用来缓存用户定义的热点数据,用户直接从缓存中读取热点数据,降低数据库的读写压力。而MySql是主要作为数据的落盘。

3:提升MySql访问性能的方式

1:读写分离:利用MySql的主从复制,我们设置多个从数据库,一个主数据库,我们进行主从复制的操作,然后主数据库主要负责写的操作,而其他从数据库负责读的操作。这样读写分离之后,会降低主数据库读的压力。但是当碰到对于读的时效性很强的时候,我们不得不读取主数据库了。

2:连接池:我们MySql中存在连接池的组件,会开启多个线程去服务这几个连接。有了连接池可以大大提高并发访问数据库的能力。并且网络模型为select + 阻塞IO模型。我们当开启事务的时候,我们要保证这事务中的sql语句全部在一个线程中执行。

3:异步连接:可以采用非阻塞IO的方式,也就是异步方法。

4:热点数据的读写策略(redis)

1:安全为主

 如果要以安全为主,我们就要避免主数据库和从数据库读取的数据不同的问题。当我们先写入MySQL后,必然会出现MySQL与Redis数据不同的问题,那么我们就不能先写入MySQL。而是要先删除Redis中的数据,然后再写入MySQL,最后将MySQL中的数据同步到Redis中去,这样就保证两方的数据一致了。但是我们的缓存方案就是为了提升效率,现在却为了安全而降低了效率,这是我们不愿看到的。

2:速度为主

如果要以效率为主,我们可以先写入缓存,并且设置过期时间(大约是200毫秒),然后再写入MySQL,当写入MySQL后,我们再将MySQL中的数据同步到Redis中去。当同步到Redis中去的时候,这个过期时间也就到期了。过期时间是与MySQL网络传输时间+MySQL处理时间+MySQL同步到Redis的时间。有个问题是如果当写入MySQL写入失败,这个时候Redis中含有数据,那么他就会提供脏数据。但是这个问题也就200毫秒的存活时间,因为从数据库会找主数据库进行同步。

5:缓存问题的解决方法

1:缓存穿透

问题:如果黑客让客户端一直读取MySQL和Redis中都不存在的数据,那么所有的读取操作都落在了MySQL中,那么就会造成MySQL中访问的性能急剧降低。

解决:如果在Redis和MySQL中读取的数据都不存在,那么就在Redis中设置一个<Key,nil>,代表查找的这个热点数据不存在。或者部署布隆过滤器(类似于哈希表),使这些数据只能增加,不能删除,具体可以搜一搜。

2:缓存击穿

问题:如果Redis中没有,但是MySQL中有,也就是说本来一个热点数据,在Redis中存在,但是过期了,那么大量的并发请求读取操作就会落到MySQL中,这样就造成MySQL访问的性能急剧降低。

解决:我们可以将过热的数据设置成不过期的状态。或者是添加分布式锁,将并发的请求操作,变成串行执行。

3:缓存雪崩

问题:我们在写入Redis中的数据是需要加入过期时间的,但是当我们不小心将多个过热数据的过期时间设置成统一时间,就会面临大量热点数据集中失效的问题,虽然失效,但是在MySQL中还是存在这个数据,所以大量的请求读取操作就会落到MySQL中去,就会造成MySQL访问性能急剧降低。

解决:我们可以将这个过期时间给错开,避免同时过期。当然我们可以在重启MySQL的时候,先将一些热数据先缓存到Redis中。

五:一些小问题

1:MySQL的集群是用什么样的方式去增加并发量

使用连接池技术,合理使用索引,优化SQL语句,分库分表,使用存储过程。

2:B树和B+树的区别

1.B树只适合随机检索,B+树支持随机检索和顺序检索

2.B+树空间利用率高,可以减少IO次数,磁盘读写代价更低。 一般来说索引本身也很大,往往以索引文件的形式存储在磁盘上,这样索引查找过程就要产生磁盘IO消耗。B+树的内部节点只作为索引使用,其内部节点(非叶子节点)比B树更小,判断能容纳的节点中关键字更多,一次读取到的键更多。 3.B+树查询效率更稳定,因为数据存放在叶子节点。

4.B树在一定程度上也提高了磁盘IO性能,但没有解决遍历效率低下的问题。B+树的叶子节点都使用指针顺序连接在一起,只要遍历叶子节点就可以实现所有值。

5.增删文件时,B树需要重新调整树结构。B+树不需要调整树结构,因此B+树效率更高。

3:数据库的ACID怎么实现

1:原子性:要么都发生要么都不发生,所以需要实现回滚的操作,那么我们就要实现undolog的回滚日志。我们在数据库执行操作的时候,我们生成一个undolog,里面包含的是数据库的SQL,当执行失败的时候,我们通过我们的undolog进行回滚,也就是当插入insert的话,那我们就执行delete,如果是update,那我们就反向执行update。反正就是通过undolog进行回滚操作。

2:一致性:是数据库的完整性和一致性,我们使用其他三个特性来完成这一个特性。

3:隔离性:对于隔离性需要实现MVCC

4:持久性:对于持久性就是我们实现redolog,我们采用预先写的方法,也就是我们在修改之前先将操作写入日志,然后再写入bufferpool,这样mysql宕机之后的话,我们重启就可以读取到redolog的数据。

4:mysql的binlog是什么

binlog是二进制日志,他记录了数据库上的所有改变,并以二进制的形式保存在从磁盘中。它可以用来查看数据库的变更历史,数据库增量备份和恢复,mysql的主从数据库的复制。

5: 当前读和快照读

当前读:像select lock in share mode ,select for update ,update ;insert; delete 。这些操作都是一种当前读,为什么叫当前读,就是他读取的是当前记录的最新版本,读取时还要保证其他事务不能修改当前记录,所以会对记录进行加锁。

快照读:像不加锁的select就是快照读。快照读的实现是基于MVCC的操作实现的,他的操作避免了加锁的操作,只是拿取一个数据版本。

6:数据库锁

在MySQL中,锁可以分为共享锁和排它锁两种类型。共享锁用于读取数据,而排它锁用于修改数据。当一个事务获得了排它锁后,其他事务就不能再对该数据进行修改,直到该事务释放锁为止。

7:项目怎么进行死锁检测

可以使用jstack工具

或者写死锁检测的代码:Linux下的死锁检测组件(分模块讲解)_linux死锁检测-CSDN博客

8:什么时候使用读已提交

        读已提交是一种常见的隔离级别,它可以提高并发性和数据准确性:订单系统
        假设有一个在线商店,它需要处理大量订单。多个用户可能同时提交订单,如果不使用读已提交隔离级别,有可能会出现数据混乱或错误的情况。例如,一个用户提交订单时,第二个用户同时查看订单,但却看到了已提交但未完成的订单,导致订单重复或缺失。使用读已提交隔离级别可以避免这种情况,确保每个用户都只看到已经提交并生效的订单。

9:搜索慢怎么解决

        我们通过使用 EXPLAIN 来查看 SQL 语句的具体执行过程。 原理:模拟优化器执行 SQL 查询语句,从而知道 MySQL 是如何处理 SQL 语句的。

        首先我们需要找到SQL这个语句在哪里,通过 show processlist 列出较慢的连接通道来 以及使用慢查询日志来找到具体的SQL语句。再分析SQL中我们要先查看在where、group by、order by中是否使用索引,如果没有使用,那么就可以考虑是否添加索引,然后继续优化SQL语句中in和not in 变成联合查询,并且减少整体的联合查询。以及一个隐形的问题:age问题,应该存储出生年月,让客户端进行计算年纪。

https://github.com/0voice

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

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

相关文章

C#实现一个HttpClient集成通义千问-开发前准备

集成一个在线大模型&#xff08;如通义千问&#xff09;&#xff0c;来开发一个chat对话类型的ai应用&#xff0c;我需要先了解OpenAI的API文档&#xff0c;请求和返回的参数都是以相关接口文档的标准进行的 相关文档 OpenAI API文档 https://platform.openai.com/docs/api-…

python游戏设计---飞机大战

1.前言 上次做飞机大战游戏有人这么说&#xff1a; 好好好&#xff01;今天必须整一个&#xff0c;今天我们来详细讲解一下&#xff0c;底部找素材文件下载&#xff01;&#xff01;&#xff01; 2.游戏制作 目录如下&#xff1a; 1.导入的包 import pygame import sys imp…

Final Vision Get Picture Pos Send 2 Python Control Robot

import tkinter as tk from tkinter import messagebox, filedialog from tkinter import ttk import socket import threading import subprocess from datetime import datetime from PIL import Image, ImageTk import time # 全局变量 client_socket None connected Fal…

Spring框架-IoC的使用(基于XML和注解两种方式)

一、Spring IoC使用-基于XML 1 IoC使用-基于XML 使用SpringIoC组件创建并管理对象 1.1 创建实体类 package com.feng.ioc.bean;import java.util.Date;/*** program: spring-ioc-demo1* description: 学生实体类* author: FF* create: 2024-12-04 18:53**/ public class Stud…

C++编程控制舵机的实现与应用

在嵌入式编程和物联网应用中&#xff0c;舵机是一种非常重要的执行器&#xff0c;广泛应用于机器人、遥控玩具、机械臂、摄像头云台等多个领域。舵机不仅能够精准地控制角度位置&#xff0c;还能在一定的工作范围内持续保持该位置。在本篇文章中&#xff0c;我们将站在 C 编程教…

对于MySQL中视图的相关实验

以下用该表举例&#xff1a; /*Table structure for table employees */ DROP TABLE IF EXISTS employees; CREATE TABLE employees ( employee_id int(6) NOT NULL DEFAULT 0, first_name varchar(20) DEFAULT NULL, last_name varchar(25) NOT NULL, email varc…

day-90 使数组为空的最少操作次数

思路 统计每个数字出现的次数&#xff0c;计算每个数字的操作次数&#xff0c;将所有操作次数累加返回即可 解题过程 对于每个数字&#xff08;假设出现次数num&#xff09;,如果num等于1,返回-1&#xff1b;如果num%3等于0&#xff0c;返回num/3&#xff1b;如果num%3不等于0…

6.xftp使用教程

xftp用于windows和linux之间进行文件互传 1.先安装xftp软件&#xff0c;并双击打开 2.文件 – 新建 3.配置参数 4.连接 5.把需要的文件扯到右边

[nmap] 端口扫描工具的下载及详细安装使用过程(附有下载文件)

前言 nmap网络连接端扫描软件&#xff0c;用于主机发现、端口扫描、版本侦测、操作系统侦测 namp 链接&#xff1a;https://pan.quark.cn/s/4ea55a2d62c3 提取码&#xff1a;aXnr 下载压缩包后解压 &#xff01;&#xff01;安装路径不要有中文 链接失效&#xff08;可能被官…

详解组合模式

引言 有一种情况&#xff0c;当一组对象具有“整体—部分”关系时&#xff0c;如果我们处理其中一个对象或对象组合&#xff08;区别对待&#xff09;&#xff0c;就可能会出现牵一发而动全身的情况&#xff0c;造成代码复杂。这个时候&#xff0c;组合模式就是一种可以用一致的…

计算机网络复习——概念强化作业

物理层负责网络通信的二进制传输 用于将MAC地址解析为IP地址的协议为RARP。 一个交换机接收到一帧,其目的地址在它的MAC地址表中查不到,交换机应该向除了来的端口外的所有其它端口转发。 关于ICMP协议,下面的论述中正确的是ICMP可传送IP通信过程中出现的错误信息。 在B类网络…

SQL语法——DQL查询

1.查询: 基础查询&#xff1a; select 列名1,列名2 from 表名; # 输入列名为*时为全查 条件查询&#xff1a; select 列名 from 表名 where 条件; #条件中含字符串时为字符串

Manus手套动作捕捉AI训练灵巧手

随着人工智能&#xff08;AI&#xff09;和机器人技术的融合日益紧密&#xff0c;使用真实动作数据AI扩容训练机器人的方式正在被用于开发更富表现力的机器人。Manus手套凭借精准的动作捕捉技术和导出数据的强大兼容性&#xff0c;在灵巧手的研发和应用中发挥了重要作用。 手部…

Altium Designer学习笔记 29 PCB布线_信号线

基于Altium Designer 23学习版&#xff0c;四层板智能小车PCB 更多AD学习笔记&#xff1a;Altium Designer学习笔记 1-5 工程创建_元件库创建Altium Designer学习笔记 6-10 异性元件库创建_原理图绘制Altium Designer学习笔记 11-15 原理图的封装 编译 检查 _PCB封装库的创建Al…

【02】复用松散型栅格切片

栅格切片分三种类型&#xff1a; 松散型、紧凑型v1紧凑型v2 见链接&#xff1a;https://blog.csdn.net/gislaozhang/article/details/144296963 说明&#xff1a;Linux环境或者Windows环境都可以参考类似的思路复用 前提条件&#xff1a;将旧服务切片服务缓存文件拷贝到新机器…

dd破坏asm磁盘头恢复---惜分飞

有朋友对asm disk的磁盘头dd了2048byte的数据 通过分析,gi软件版本,确认是11.2.0.4 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Real Application Clusters and Automatic Storage Management options. ORACLE_HOME /u01/app/…

【多线程-第一天-NSThread-互斥锁和自旋锁的区别-练习-异步下载网络图片 Objective-C语言】

一、互斥锁和自旋锁的区别 1.刚刚我们看过了,互斥锁和自旋锁,下边我们来看,互斥锁和自旋锁的一个区别, 1)互斥锁:如果发现其他线程正在执行锁定代码,线程会进入休眠(就绪状态),等其他线程时间片到了,打开锁后,线程会被唤醒(执行) 它是被唤醒的,相当于什么呢,…

【vue3 for beginner】Pinia基本用法:存储user的信息

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 Pinia 简介 Pinia 是一个用于 Vue.js 应用的状态管理库&#xff0c;是 Vuex 的…

PS的功能学习(钢笔+...)

钢笔工具 转换点工具&#xff0c;就是按住alt就可以转换了&#xff0c;也不用特意去工具列表里找着点 弯度钢笔工具也是比较鸡肋的&#xff0c;钢笔工具熟练之后&#xff0c;控制的也会更精确&#xff0c;弯度虽然简化了&#xff0c;但是也增加了曲线的弯度限制 其他的功能&a…

论著和教材的区别是什么?

1、内容性质 论著&#xff1a; 内容以作者的研究成果和学术观点为主。它是作者在某一学科领域进行深入研究后&#xff0c;通过实验、调查、理论推导等方式得出的创新性见解。例如&#xff0c;在生物学论著中&#xff0c;作者可能通过长期的野外观察和基因分析&#xff0c;提出…