mysql八股1

news2024/10/11 2:18:39

参考MySQL八股文连环45问(背诵版) - 知乎 (zhihu.com)

基础

1.范式

第一范式:强调的是列的原子性

第二范式:要求实体的属性完全依赖于主关键字。所谓完全 依赖是指不能存在仅依赖主关键字一部分的属性。(就是主键不可精简了)

第三范式:任何非主属性不依赖于其它非主属性(非主键内容之间不存在相互依赖)

2. MySQL 支持哪些存储引擎?

MySQL 支持多种存储引擎,比如 InnoDB,MyISAM,Memory,Archive 等等.在大多数的情况下,直接选择使用 InnoDB 引擎都是最合适的,InnoDB 也是 MySQL 的默认存储引擎。

MyISAM 和 InnoDB 的区别有哪些:

  • InnoDB 支持事务,MyISAM 不支持
  • InnoDB 支持外键,而 MyISAM 不支持
  • InnoDB 是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高;MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针,主键索引和辅助索引是独立的。
  • Innodb 不支持全文索引,而 MyISAM 支持全文索引,查询效率上 MyISAM 要高;
  • InnoDB 不保存表的具体行数,MyISAM 用一个变量保存了整个表的行数
  • MyISAM 采用表级锁(table-level locking);InnoDB 支持行级锁(row-level locking)和表级锁,默认为行级锁。

3. 超键、候选键、主键、外键分别是什么?

  • 超键:在关系中能唯一标识元组的属性集称为关系模式的超键。一个属性可以为作为一个超键,多个属性组合在一起也可以作为一个超键。超键包含候选键和主键。(就是可以包含冗余属性的候选键)
  • 候选键:即没有冗余元素的超键。
  • 主键:数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null)(从所有候选键中选一个用作标识符的候选键)。
  • 外键:在一个表中存在的另一个表的主键称此表的外键。(一个表的非主属性关联着另一个表的主键)

4. SQL 约束有哪几种?

非空 + 唯一 + 主外键 + 检查

  • NOT NULL(非空): 
  • UNIQUE(控制属性值唯一): 控件字段内容不能重复,一个表允许有多个 Unique 约束。
  • PRIMARY KEY: 
  • FOREIGN KEY:
  • CHECK(检查某些属性的范围):

5. MySQL 中的 varchar 和 char 有什么区别?

一个定长一个变长。如果确定长度使用char,否则尽量varchar

char 是一个定长字段,假如申请了char(10)的空间,那么无论实际存储多少内容.该字段都占用 10 个字符,而 varchar 是变长的,也就是说申请的只是最大长度,占用的空间为实际字符长度+1,最后一个字符存储使用了多长的空间.

在检索效率上来讲,char > varchar,因此在使用中,如果确定某个字段的值的长度,可以使用 char,否则应该尽量使用 varchar.例如存储用户 MD5 加密后的密码,则应该使用 char。

6.MySQL中 in 和 exists 区别

MySQL中In与Exists的区别_in和exists的区别_lzcWHUT的博客-CSDN博客

in是先做某一个字段的子查询,结果集为B,然后把主表A要查的字段检查是否在子查询的结果集B里。相当于先做子查询在做主查询。

exist是对主表A的每一个记录拿到exist的子查询B里去对比,如果查到了就把这个记录保留下来,最后得到的是所有在B里有存在的A的记录集合。相当于二层循环。

MySQL中的in语句是把外表和内表作hash 连接,而exists语句是对外表作loop循环。

如果查询的两个表大小相当,那么用in和exists差别不大

如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in。

not in 和not exists:如果查询语句使用了not in,那么内外表都进行全表扫描,没有用到索引;而not extsts的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。

7.drop、delete与truncate的区别

delete删除指定行

truncate清空一张表,但结构还在

drop直接丢弃表或者数据库

8. 什么是存储过程?有哪些优缺点?

存储过程是一些预编译的 SQL 语句。包含对单表或者多表的一些操作,由于是预编译,效率会高一些。

理解是类似于预先设定好的函数,封装一堆操作,还能起个名。

事务

1.是什么

具有原子性

是一个不可分割的数据库操作序列,数据库并发控制的基本单位。使数据库从一个状态变换到另一个稳定状态。

比如转账:A减少1000元,B增加1000。整体具有原子性。

2. 介绍一下事务具有的四个特征acid

原子性a:事务中包含的各操作要么都做,要么都不做

一致性c:事 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。

隔离性i:事务之间互不干扰

持久性d:事务提交对数据库数据的影响是永久的,即使数据库出现故障也要完成提交的事务。

3. 说一下MySQL 的四种隔离级别

  • Read Uncommitted(读取未提交内容)  ->存在三大问题

在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。

  • Read Committed(读取提交内容)->解决脏读

这是大多数数据库系统的默认隔离级别(但不是 MySQL 默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓 的 不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的 commit,所以同一 select 可能返回不同结果。

  • Repeatable Read(可重读)->解决不可重复读

这是 MySQL 的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。

  • Serializable(可串行化)->解决幻读

通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。

4.三大并发问题

(5 封私信 / 18 条消息) 什么是脏读、不可重复读、幻读? - 知乎 (zhihu.com)

Mysql的四个隔离级别是如何实现的_mysql四个隔离级别配置-CSDN博客

脏读:事务A读取到了事务B中未提交的数据,当事务B回滚后,事务A读取到的数据都是脏数据。

不可重复读:事务A多次读取同一数据,但每次读取的值不同。这是因为事务B在A的读取之间更新和提交新数据。

幻读:事务A在多次查询中,表数据多次新增或删除,导致几次查询都出现新增数据或者缺少记录。

不可重复读侧重的是数据的修改,幻读侧重的是数据的新增或删除。解决不可重复读,只有锁住行,而解决幻读,需要锁住整张表。

5. 事务的实现原理(redo重做和undo撤销)

事务是基于重做日志文件(redo log)和回滚日志(undo log)实现的。

每提交一个事务必须先将该事务的所有日志写入到重做日志文件进行持久化,数据库就可以通过重做日志来保证事务的原子性和持久性。

每当有修改事务时,还会产生 undo log,如果需要回滚,则根据 undo log 的反向语句进行逻辑操作,比如 insert 一条记录就 delete 一条记录。undo log 主要实现数据库的一致性

7. 什么是MySQL的 binlog?

MySQL的 binlog 是记录所有数据库表结构变更,比如增删改,查询不包含因为不变更表结构,需要看查询要去通用日志看。

8. 在事务中可以混合使用存储引擎吗?

尽量不要在同一个事务中使用多种存储引擎,回滚的时候会导致数据库不一致,每张表需要确定好自己的引擎

9. MySQL中是如何实现事务隔离的?

读未提交和串行化基本上是不需要考虑的隔离级别,前者不加锁限制,后者相当于单线程执行,效率太差。

MySQL 在可重复读级别解决了幻读问题,是通过行锁和间隙锁的组合 Next-Key 锁实现的。

详细原理看这篇文章:https://haicoder.net/note/MySQL

10. 什么是 MVCC?

MVCC, 即多版本并发控制。MVCC 的实现,是通过保存数据在某个时间点的快照来实现的。根据事务开始的时间不同,每个事务对同一张表,同一时刻看到的数据可能是不一样的。

1. 为什么要加锁?

当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。

保证多用户环境下保证数据库完整性和一致性。

2.按照锁的粒度分数据库锁有哪些?(行,表,页)

在关系型数据库中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎)、表级锁(MYISAM引擎)和页级锁(BDB引擎 )。

行级锁

  • 行级锁是MySQL中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。行级锁分为共享锁 和 排他锁。
  • 开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

表级锁

  • 表级锁是MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。最常使用的MYISAM与INNODB都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)。
  • 开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发度最低。

页级锁

  • 页级锁是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。BDB支持页级锁
  • 开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般

MyISAM和InnoDB存储引擎使用的锁:

  • MyISAM采用表级锁(table-level locking)。
  • InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁

 

3. 从锁的类别上分MySQL都有哪些锁呢?(共享锁和排他锁)

从锁的类别上来讲,有共享锁和排他锁

  • 共享锁: 又叫做读锁。 当用户要进行数据的读取时,对数据加上共享锁。共享锁可以同时加上多个。
  • 排他锁: 又叫做写锁。 当用户要进行数据的写入时,对数据加上排他锁。排他锁只可以加一个,他和其他的排他锁,共享锁都相斥。

4. 数据库的乐观锁和悲观锁是什么?怎么实现的?

数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段。

  • 悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。在查询完数据的时候就把事务锁起来,直到提交事务。它是以一种预防的姿态在修改数据之前把数据锁住,然后再对数据进行读写,在它释放锁之前任何人都不能对其数据进行操作,直到前面一个人把锁释放后下一个人数据加锁,基本就是类似独占
  • 乐观锁:乐观锁是对于数据冲突保持一种乐观态度,操作数据时不会对操作的数据进行加锁(这使得多个任务可以并行的对数据进行操作),只有到数据提交的时候才通过一种机制来验证数据是否存在冲突。实现方式:一般实现方式是通过加版本号然后进行版本号的对比方式实现。

两种锁的使用场景

从上面对两种锁的介绍,我们知道两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写比较少的情况下(多读场景),即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。

但如果是多写的情况,一般会经常产生冲突,这就会导致上层应用会不断的进行retry,这样反倒是降低了性能,所以一般多写的场景下用悲观锁就比较合适。

5. 什么是死锁?怎么解决?

死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象。(资源请求达成一个环,谁也不能动)

常见的解决死锁的方法

1、如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会。

2、在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率;

3、对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率;

如果业务处理不好可以用分布式事务锁或者使用乐观锁

6. 隔离级别与锁的关系

在读未提交级别下,无锁

在读已提交级别下,读操作需要加共享锁,但是在语句执行完以后释放共享锁;

在可重复读级别下,读操作需要加共享锁,但是在事务提交之前并不释放共享锁,也就是必须等待事务执行完毕以后才释放共享锁

可串行化是限制性最强的隔离级别,因为该级别锁定整个范围的键,并一直持有锁,直到事务完成。

7. 优化锁方面的意见?

  • 使用较低的隔离级别
  • 设计索引,尽量使用索引去访问数据,加锁更加精确,从而减少锁冲突
  • 选择合理的事务大小,给记录显示加锁时,最好一次性请求足够级别的锁。列如,修改数据的话,最好申请排他锁,而不是先申请共享锁,修改时在申请排他锁,这样会导致死锁
  • 不同的程序访问一组表的时候,应尽量约定一个相同的顺序访问各表,对于一个表而言,尽可能的固定顺序的获取表中的行。这样大大的减少死锁的机会。
  • 尽量使用相等条件访问数据,这样可以避免间隙锁对并发插入的影响
  • 不要申请超过实际需要的锁级别
  • 数据查询的时候不是必要,不要使用加锁。MySQL的MVCC可以实现事务中的查询不用加锁,优化事务性能:MVCC只在committed read(读提交)和 repeatable read (可重复读)两种隔离级别
  • 对于特定的事务,可以使用表锁来提高处理速度活着减少死锁的可能

分库分表

读写分离、主从同步

1. 什么是MySQL主从同步?

主从同步使得数据可以从一个数据库服务器复制到其他服务器上,在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave)。

因为复制是异步进行的,所以从服务器不需要一直连接着主服务器,从服务器甚至可以通过拨号断断续续地连接主服务器。通过配置文件,可以指定复制所有的数据库,某个数据库,甚至是某个数据库上的某个表。

2. MySQL主从同步的目的?为什么要做主从同步?

  1. 主改,从读)通过增加从服务器来提高数据库的性能,在主服务器上执行写入和更新,在从服务器上向外提供读功能,可以动态地调整从服务器的数量,从而调整整个数据库的性能。
  2. 数据安全)提高数据安全-因为数据已复制到从服务器,从服务器可以终止复制进程,所以,可以在从服务器上备份而不破坏主服务器相应数据
  3. 从服务器分担计算,提高性能)在主服务器上生成实时数据,而在从服务器上分析这些数据,从而提高主服务器的性能
  4. 数据备份。一般我们都会做数据备份,可能是写定时任务,一些特殊行业可能还需要手动备份,有些行业要求备份和原数据不能在同一个地方,所以主从就能很好的解决这个问题,不仅备份及时,而且还可以多地备份,保证数据的安全

3. 如何实现MySQL的读写分离?

其实很简单,就是基于主从复制架构,简单来说,就搞一个主库,挂多个从库,然后我们就单单只是写主库,然后主库会自动把数据给同步到从库上去。

优化

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

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

相关文章

Linux防火墙(iptables)

一、linux的防火墙组成 linux的防火墙由netfilter和iptables组成。用户空间的iptables制定防火墙规则,内核空间的netfilter实现防火墙功能。 netfilter(内核空间)位于Linux内核中的包过滤防火墙功能体系,称为Linux防火墙的“内核…

Vulnhub:Kira: CTF靶机

kali:192.168.111.111 靶机:192.168.111.238 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.238访问80端口 点击upload发现是个上传点 点击language发现存在文件包含 上传php图片马再利用文件包含反弹shell http://1…

CIO40: 数字化落地最佳实践(16000字)

1-数字化规划 第一步:数字化规划。CIO要根据企业的发展现况及未来战略方向、根据企业董事长的布局和理念、根据企业各业务板块领导人的格局和理念,做出一份董事长和领导层高度认同的数字化规划,而且需要用PPT进行完整和专业的表达出来&#x…

基于SpringBoot的在线教育平台系统

基于SpringBootVue的线教育平台系统,前后端分离 开发语言:Java数据库:MySQL技术:SpringBoot、Vue、Mybaits Plus、ELementUI工具:IDEA/Ecilpse、Navicat、Maven 【主要功能】 角色:管理员、学生、老师 …

When后接什么动词?

1、when doing用法 When从句的主语和主句的主语是同一个或同一些人时,从句的谓语动词为be动词doing形式,可以把从句的主语和be动词省略,即用when doing sth是指当做……事情时, 如: when doing the work,we should b…

(以太网交换机)BCM53575B0KFSBG、BCM56870A0KFSBG、BCM56760B0KFSBG采用BGA封装的集成电路

一、BCM53575B0KFSBG 1G/2.5G/10G/25G TSN 连接交换机 应用 中小企业 2.5G/10G 交换机 使用时间敏感网络(TSN)的工业以太网/汽车应用 联网 (TSN) 的工业以太网/汽车应用 用于基站、闪存阵列、专业级音频/视频和机箱背板的嵌入式连接交换机 (…

自然语言处理NLP:一文了解NLP自然语言处理技术,NLP在生活中的应用,图导加深了解,NLP语料库,NLP开源工具

目录 1.自然语言处理NLP 1.1 NLP中英对照(双份) 1.2 相关文章 2.NLP语料库 2.1 NLP语料库列举 2.2 相关文章 3.NLP开源工具 3.1 NLP开源工具列举 3.2 相关文章 4.自然语言文本分类模型代码 5.图导NLP 6. NLP在生活中的应用 1.自然语言处理NLP …

Kafka中Consumer源码解读

Consumer源码解读 本课程的核心技术点如下: 1、consumer初始化 2、如何选举Consumer Leader 3、Consumer Leader是如何制定分区方案 4、Consumer如何拉取数据 5、Consumer的自动偏移量提交 Consumer初始化 从KafkaConsumer的构造方法出发,我们跟踪到…

ubuntu22.04 设置网卡开机自启

配置文件路径 在Ubuntu中,网络配置文件通常位于/etc/netplan/目录下,其文件名以.yaml为后缀。Netplan是Ubuntu 17.10及更高版本中默认的网络配置工具,用于配置网络接口、IP地址、网关、DNS服务器等。 我们可以看到配置文件为 01-network-ma…

【K210+ESP8266图传上位机开发】TCP server + JPEG图像解析上位机开发

本文章主要记录基于 【K210-ESP8266】 图传和显示的过程,上位机开发过程,系统架构和下位机开发请参考文章: 【K210-ESP8266】开发板上传图像数据到服务器并实时显示 💖 作者简介:大家好,我是喜欢记录零碎知…

easyrecovery 2023最新数据恢复软件免费下载激活教程

对于每天电脑不离身,键盘不离手的法律人来说,最惨痛的事故莫过于“没保存”了,意外断电、系统崩溃、介质故障、计算机病毒、文件误删除、系统升级、文件同步更新、程序运行意外中止、人为故意删改等各种原因都可能导致我们的文件数据损坏和丢…

eNSP-抓包实验

拓扑结构图: 实验需求: 1. 按照图中的设备名称,配置各设备名称 2. 按照图中的IP地址规划,配置IP地址 3. 使用Wireshark工具进行抓ping包,并分析报文 4. 理解TCP三次握手的建立机制 实验步骤: 1、配置P…

synchronized,volatile关键字

目录 一,synchronized的特性 1.1 互斥性 1.2 可重入性 二, 死锁 2.1 死锁产生的原因 三,volatile 关键字 3.1 能保证内存可见性 一,synchronized的特性 1.1 互斥性 当两个线程对同一个对象加锁时,后加锁的线程…

Error: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试

Error: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试 django运行时报错 报错原因 django运行时的端口被其他服务占用了,此时需要关闭占用端口的服务, django的默认端口为8000 解决办法1 netstat -ano | findstr 8000 // cmd操作获取占用…

天翼云HBlock:盘活存储资源,释放数据价值

马克安德森曾言:“软件正在吞噬世界。” 回顾数据存储过去二十年发展,硬件的更新迭代固然重要,但软件的价值亦不可低估。从2013年软件定义存储首次入围Gartner技术成熟度曲线,再到在虚拟化和云计算环境中大显身手,软件…

运维Shell脚本小试牛刀(八): case模式忽略命令行参数大小写演示

运维Shell脚本小试牛刀(一) 运维Shell脚本小试牛刀(二) 运维Shell脚本小试牛刀(三)::$(cd $(dirname $0); pwd)命令详解 运维Shell脚本小试牛刀(四): 多层嵌套if...elif...elif....else fi_蜗牛杨哥的博客-CSDN博客 Cenos7安装小火车程序动画 运维Shell脚本小试…

SpringCloud-GetWay 路由网关

接上文 SpringCloud-Hystrix 服务降级与熔断 微服务也是如此,不是所有微服务需要直接暴露给外部调用,就需要使用路由机制,添加一层防护,让所有的请求全部通过路由来转发到各个微服务,并转发给多个相同微服务实例&#…

Linux编辑器 VI VIM

vim 命令模式 插入模式 ex模式 \ 命令模式 /查找关键字后,按n键在找到的结果之前来换的切换、 EX模式

响应式布局(3种) + flex计算

响应式布局 1.媒体查询2.使用百分比、rem、vw、vh等相对单位来设置元素的宽度、高度、字体大小等1.rem与em2.vw、vh、vmax、vmin 3.Flexboxflexbox计算题 响应式布局是指同一个页面在不同屏幕尺寸下有不同的布局。 1.媒体查询 媒体查询是最基础的实现响应式的方式 使用media关键…

再见 MySQL 5.7 !

点击下方名片,设为星标! 回复“1024”获取2TB学习资源! 对从事互联网 IT 技术岗位的来说,数据库也是我们日常必备的技能之一,而 MySQL 数据库更是常见、常用的数据库之一。 根据 DB-Engines 的数据显示,MyS…