【面试题】mysql常见面试题及答案总结
事务中的ACID原则是什么? Mysql是如何实现或者保障ACID的?
ACID原则是数据库事务管理中必须满足的四个基本属性,确保了数据库事务的可靠性和数据完整性。
| 简写 | 全称 | 解释 | 实现 |
|---|---|---|---|
| A | 原子性(Atomicity) | 一个事务被视为一个不可分割的操作序列,这些操作要么全部成功完成,要么全部不执行。如果事务中的任何部分失败,则整个事务将被回滚到事务开始前的状态。 | 在MySQL中,通过使用InnoDB存储引擎实现原子性。InnoDB使用redo log(重做日志)来保证即使在系统崩溃的情况下,也能通过重做已经记录的日志而恢复未提交事务的更改;同时使用undo log(回滚日志)来撤销已执行但未提交的事务对数据库所做的修改。 |
| C | 一致性(Consistency) | 事务完成后,数据库从一个一致状态变换到另一个一致状态,即无论事务是否执行,系统的业务规则始终得到维护。 | 在MySQL中,通过使用InnoDB存储引擎实现原子性。InnoDB使用redo log(重做日志)来保证即使在系统崩溃的情况下,也能通过重做已经记录的日志而恢复未提交事务的更改;同时使用undo log(回滚日志)来撤销已执行但未提交的事务对数据库所做的修改。 |
| I | 隔离性(Isolation) | 多个事务并发执行时,每个事务都好像在单独执行一样,不会受到其他事务的影响。 | MySQL提供了多种事务隔离级别(读未提交、读已提交、可重复读和串行化),通过不同级别的锁定机制控制事务间的可见性和并发副作用。默认情况下,InnoDB使用的是可重复读隔离级别。 |
| D | 持久性(Durability) | 一旦事务提交成功,它对数据库的修改就被永久保存下来,即使发生系统故障也不会丢失。 | InnoDB同样利用redo log实现持久性。当事务提交时,其改动先写入redo log buffer,然后通过innodb_flush_log_at_trx_commit参数配置的不同策略将其刷入磁盘上的redo log文件,从而确保即使在服务器宕机后,也能够通过redo log进行恢复,使得已提交的事务具有持久性。 |
综上所述,MySQL通过InnoDB存储引擎提供的redo log、undo log、行级锁定以及其他一系列机制,实现了ACID事务管理的要求。
介绍下innodb的聚簇索引
聚簇索引(Clustered Index)是数据库中表数据的一种物理存储方式,尤其是在关系型数据库管理系统如MySQL的InnoDB存储引擎中得到广泛应用。
实现
聚簇索引的数据结构通常采用B+树(B-plus Tree)。
在MySQL的InnoDB存储引擎中,聚簇索引的具体实现如下:
- B+树结构:聚簇索引是基于B+树建立的。B+树是一种自平衡的多路搜索树,每个节点可以有多个子节点,并且所有的叶子节点都在同一个层级上,形成了一个有序链表。
- 叶子节点存储数据:在聚簇索引中,B+树的叶子节点不仅包含索引键值,还包含了完整的行数据。这意味着数据行就是按照索引键值排序并物理存储在磁盘上的。
- 主键作为聚簇索引:对于InnoDB存储引擎,默认情况下,如果表定义了主键,那么主键列就会被用作聚簇索引的键。如果没有显式定义主键,则会选择一个唯一的非空索引(如果存在),否则会生成一个内部row_id作为聚簇索引的键。
- 二级索引引用聚簇索引:当创建非聚簇索引(二级索引)时,其叶子节点不再直接包含行数据,而是存储对应行的主键值。查询时,先通过二级索引找到主键值,再通过聚簇索引定位到实际的数据行。
这种设计使得对主键进行范围扫描或顺序访问时效率很高,同时也优化了二级索引的性能,因为它们可以通过链接快速定位到相应的行数据。
优势:
- 数据访问更快:由于索引和数据位于同一B+树中,根据主键查询时可以直接定位到数据,无需额外回表操作,因此性能非常高。
- 数据局部性:聚集索引使得相关数据紧密地存储在一起,对于范围查询非常高效,因为连续的索引键通常对应着物理位置相邻的数据页,这有助于减少磁盘I/O次数。
- 辅助索引优化:即使是对非主键的二级索引(非聚簇索引),其叶子节点存储的是对应的主键值,而非行的所有信息。当通过二级索引查找数据时,需要两次索引查找,但第二次查找是在聚簇索引中,可以利用到聚簇索引的优点。
- 插入效率:如果数据按照主键的自然顺序插入,并且主键值增长较为连续,那么插入操作相对高效,因为新记录往往会被添加到现有数据文件的末尾,而不会引起大量的页分裂或重组。
劣势:
- 按照主键递增顺序进行,可能导致页分裂,影响性能。
- 更新主键代价较高,尤其是当主键更新导致行需要移动到新的位置时。
- 删除操作可能导致页内空间碎片,需要维护以保持页面填充率。
Innodb引擎是如何实现多版本控制的
MySQL中的版本控制通常是指多版本并发控制(MVCC,Multi-Version Concurrency Control),特别是在InnoDB存储引擎中实现的这一特性。MVCC主要用于管理并发事务间的读写冲突,并在某种程度上提供了数据的历史版本查看能力,以支持事务的隔离性和一致性。
多版本并发控制(MVCC)工作原理:
- 在InnoDB中,每个事务都有自己的视图(read view),即它能看到的数据版本范围。
- 每行记录除了包含当前值之外,还包含隐藏的系统列(如DB_TRX_ID、DB_ROLL_PTR和DB_ROW_ID等),用于追踪该行记录的创建事务ID、回滚指针和其他信息。
- 读操作根据不同的事务隔离级别,可以读取不同版本的数据:
- 在可重复读(Repeatable Read)隔离级别下,一个事务开启后看到的同一行记录在整个事务期间始终不变,即使其他事务已经修改并提交了这条记录。
- 在读已提交(Read Committed)隔离级别下,每次查询都会获取最新的已提交版本。
- 写操作会生成新的行版本,旧版本在一定条件下会被垃圾回收机制清理。
通过这种机制,多个事务可以在同一时刻看到数据库的不同版本状态,从而避免了大量的锁定冲突,提高了系统的并发性能。虽然这并不是严格意义上的“版本控制系统”(如Git或SVN等用于代码版本控制的工具),但在数据库领域内,MVCC为了解决并发控制问题提供了一种非常有效的“版本化”处理方式。同时,结合SQL语句的ROLLBACK功能,用户也可以在事务层面实现对自身操作的撤销,达到回滚效果。
MySql中的事务隔离级别
MySQL中的事务隔离级别定义了在并发事务执行时,对数据的访问和修改如何进行隔离,以防止不同事务之间的相互影响导致的数据不一致。根据ANSI SQL标准,MySQL支持以下四种事务隔离级别:
-
读未提交(Read Uncommitted):
这是最低级别的隔离,一个事务可以读取到其他事务尚未提交的数据更改。这种情况下可能出现“脏读”现象,即事务读到了随后可能被回滚的数据。
-
读已提交(Read Committed):
在这个级别,一个事务只能看到其他事务已经提交的数据。这意味着在一个事务开始后,即使有其他事务对其之前读取过的数据进行了修改并提交,当事务也不会再看到这些修改前的数据,从而避免了“脏读”。但仍然存在“不可重复读”问题,即在同一事务中多次读取同一行数据可能会得到不同的结果,为其他事务可能在此期间提交了对该行数据的更新。
-
可重复读(Repeatable Read):
这是MySQL的默认事务隔离级别。在该级别下,一个事务在整个生命周期内所读取的数据都是事务开始时的状态,即不会看到其他事务在其执行过程中提交的更新,因此避免了“脏读”和“不可重复读”。然而,在此级别下,由于幻读(Phantom Reads)的问题依然存在,即同一个事务在两次查询之间可能会看到一些新插入的满足查询条件的记录。
-
串行化(Serializable):
这是最高的隔离级别,提供了完全的事务隔离。为了实现这一点,数据库通常会使用悲观锁或其他机制来确保事务间的操作按序列执行,从而避免所有并发问题,包括“脏读”、“不可重复读”以及“幻读”。但是,这也可能导致大量的锁定和更高的并发冲突,从而降低系统的整体性能。
每种隔离级别都有其适用场景和相应的权衡,选择合适的事务隔离级别需要根据具体的应用需求和对数据一致性的要求来决定。
大数据量表的查询如何优化
| 优化方向 | 具体描述 |
|---|---|
| 索引优化 | 创建合适的索引:对经常用于查询条件的列创建索引,尤其是那些出现在JOIN、WHERE、ORDER BY和GROUP BY子句中的列。但要注意,对于大数据量表,如果全表扫描速度仍然较快,或者索引维护成本过高(如插入、更新时频繁重建索引),则可能不适用。 选择正确的索引类型:B-Tree索引适合于范围查询和精确匹配;哈希索引适合于等值查询;全文索引用于全文本搜索。 索引覆盖查询:确保查询只通过索引就能获取所有需要的数据,避免回表操作。 |
| SQL语句优化 | 避免全表扫描:尽量减少使用SELECT * FROM table,而是明确指定所需的列。 减少JOIN操作:不必要的JOIN会导致查询性能下降,尤其是在关联大表时。可以通过预处理或提前汇总数据来简化查询结构。 使用更有效的JOIN顺序:根据表的实际大小和索引情况调整JOIN顺序,优先JOIN小表或已建立有效索引的表。 利用连接条件筛选数据:在JOIN之前先对表进行过滤,减少JOIN后数据集的大小。 避免在WHERE子句中使用函数或复杂的表达式,这可能会导致无法利用索引。 |
| 分区与分片 | 表分区(Partitioning):将一个大表物理上划分为多个较小的部分,可以基于时间、范围或其他逻辑字段进行划分。这样可以提高查询效率,特别是当查询条件能限制到单个或少量分区时。 数据分片(Sharding):按照某种规则将数据分布到不同的数据库服务器或实例上,以分散存储和访问压力,提高系统的可扩展性。 |
| 临时表与中间结果集 | 使用临时表或表变量暂存中间结果,尤其在执行多步复杂查询时,可以减少计算量和I/O次数。 对于大量数据的统计计算,可以考虑定期生成汇总表,避免实时统计大规模原始数据。 |
| 硬件与配置调优 | 增加内存容量,提高缓存命中率,减少磁盘I/O。 调整数据库系统参数,比如增大缓冲池大小、合理设置排序区大小、调整事务日志相关参数等。 |
| 并发控制与锁管理 | 控制并发查询的数量,适当增加并行度,但要防止过多的锁竞争导致性能瓶颈。 尽量采用低级别的锁定机制(如行级锁或页级锁),避免使用表级锁造成不必要的阻塞 |
| 使用特定数据库引擎特性 | 如MySQL InnoDB存储引擎支持MVCC(多版本并发控制)提高读写并发性能,可以根据业务场景调整事务隔离级别。 对于分布式数据库系统,充分利用其内置的分布式查询优化机制。 |
| 监控与分析 | 定期分析查询计划,找出潜在的性能瓶颈,并针对性地进行优化。 监控系统资源使用情况,包括CPU、内存、I/O以及网络带宽等,根据实际情况进行相应调整 |
以上这些策略并不是孤立使用的,通常需要综合考虑应用的具体需求和数据库的运行状况,灵活采取相应的优化措施。
在MySQL中,如何设计高可用性的数据库架构以保证数据安全和业务连续性?
可以采用如下策略:
- 主从复制(Replication):构建一主多从结构,主库负责写操作,从库实时同步主库数据并提供读服务。
- 集群解决方案:如MySQL Group Replication或MySQL InnoDB Cluster,实现多节点间的数据同步和故障切换。
- 数据分片与分布式数据库系统:将数据分散到多个服务器上,降低单点压力,提高性能和可用性。
- 使用高可用中间件如ProxySQL进行读写分离和负载均衡。
- 定期备份并结合Binlog恢复机制,确保数据灾难恢复能力。
MySQL中有哪些常见的死锁情况?怎样避免和解决死锁?
常见死锁情况包括两个事务相互等待对方持有的锁资源导致循环等待。例如,事务A锁定表A并请求锁定表B,同时事务B已经锁定表B并请求锁定表A。
避免和解决死锁的方法:
- 设定合理的事务大小和执行顺序,尽量减少持有锁的时间。
- 使用较低的事务隔离级别,如从“可重复读”降低到“读已提交”,尽管这可能导致更多的不可重复读问题。
- 设置锁超时,当等待锁超过一定时间自动回滚事务。
- MySQL自身有检测死锁的机制,一旦检测到死锁会主动回滚其中一个事务以打破死锁循环。
相关文章:
【面试题】mysql常见面试题及答案总结
事务中的ACID原则是什么? Mysql是如何实现或者保障ACID的? ACID原则是数据库事务管理中必须满足的四个基本属性,确保了数据库事务的可靠性和数据完整性。 简写全称解释实现A原子性(Atomicity)一个事务被视为一个不可分割的操作序列&#…...
C++ 类的前向声明的用法
我们知道C的类应当是先定义,然后使用。但在处理相对复杂的问题、考虑类的组合时,很可能遇到俩个类相互引用的情况,这种情况称为循环依赖。 例如: class A { public:void f(B b);//以B类对象b为形参的成员函数//这里编译错位&…...
二分查找(c语言)
二分查找 一.什么是二分查找二.代码实现 一.什么是二分查找 在⼀个升序的数组中查找制定的数字n,很容易想到的⽅法就是遍历数组,但是这种⽅法效率⽐较低, ⽐如我买了⼀双鞋,你好奇问我多少钱,我说不超过300元。你还是好…...
【记录31】elementUI el-tree 虚线、右键、拖拽
父组件 <eltree :treeData"treeData"></eltree>import eltree from "../../components/tree.vue"; export default {name: ,components: { // org_tree ,eltree},watch: {},data() {return {orgFormchoose: {},orgForm: { type: 0, limits: 1…...
【C++】函数重载
🦄个人主页:修修修也 🎏所属专栏:C ⚙️操作环境:Visual Studio 2022 目录 📌函数重载的定义 📌函数重载的三种类型 🎏参数个数不同 🎏参数类型不同 🎏参数类型顺序不同 📌重载…...
【深度学习模型】6_3 语言模型数据集
注:本文为《动手学深度学习》开源内容,部分标注了个人理解,仅为个人学习记录,无抄袭搬运意图 6.3 语言模型数据集(周杰伦专辑歌词) 本节将介绍如何预处理一个语言模型数据集,并将其转换成字符级…...
技术选型思考:分库分表和分布式DB(TiDB/OceanBase) 的权衡与抉择
码到三十五 : 个人主页 心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 ! 在当今数据爆炸的时代,数据库作为存储和管理数据的核心组件,其性能和扩展性成为了企业关注的重点。随着业…...
React改变数据【案例】
State传统方式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>React Demo</title> <!--…...
ChatGPT Plus 自动扣费失败,如何续订
ChatGPT Plus 自动扣费失败,如何续订 如果您的 ChatGPT Plus 订阅过期或扣费失败,本教程将指导您如何重新订阅。 本周更新 ChatGPT Plus 是一种每月20美元的订阅服务。扣费会自动进行,如果您的账户余额不足,OpenAI 将在一次扣费…...
Rust: Channel 代码示例
在 Rust 中,通道(Channel)通常使用 std::sync::mpsc(多生产者单消费者)或 tokio::sync::mpsc(在异步编程中,特别是使用 Tokio 运行时)来创建。下面是一个使用 std::sync::mpsc 的简单…...
基于华为atlas的unet分割模型探索
Unet模型使用官方基于kaggle Carvana Image Masking Challenge数据集训练的模型。 模型输入为572*572*3,输出为572*572*2。分割目标分别为,0:背景,1:汽车。 Pytorch的pth模型转化onnx模型: import torchf…...
机器学习--循环神经网络(RNN)1
一、简介 循环神经网络(Recurrent Neural Network)是深度学习领域中一种非常经典的网络结构,在现实生活中有着广泛的应用。以槽填充(slot filling)为例,如下图所示,假设订票系统听到用户说&…...
基于java+springboot+vue实现的学生信息管理系统(文末源码+Lw+ppt)23-54
摘 要 人类现已进入21世纪,科技日新月异,经济、信息等方面都取得了长足的进步,特别是信息网络技术的飞速发展,对政治、经济、军事、文化等方面都产生了很大的影响。 利用计算机网络的便利,开发一套基于java的大学生…...
【漏洞复现】Linksys E2000 position.js 身份验证绕过漏洞(CVE-2024-27497)
0x01 产品简介 Linksys E2000是一款由思科(Cisco)品牌推出的无线路由器,它是一款支持2.4GHz和5GHz双频段的无线路由器,用户可以避开拥挤的2.4GHz频段,独自享受5GHz频段的高速无线生活。 0x02 漏洞概述 Linksys E200…...
小白跟做江科大51单片机之DS1302可调时钟
原理部分 1.DS1302可调时钟介绍 单片机定时器主要占用CPU时间,掉电不能继续运行 图1 2.原理 图2 内部有寄存器,寄存的时候以时分秒寄存,以通信协议实现数据交互,就可以实现对数据进行访问和读写 3.主要寄存器定义 CE芯片使能…...
2024蓝桥杯每日一题(归并排序)
一、第一题:火柴排队 解题思路:归并排序 重点在于想清楚是对哪个数组进行归并排序求逆序对 【Python程序代码】 from math import * n int(input()) a list(map(int,input().split())) b list(map(int,input().split())) na,nb [],[] for …...
生成对抗网络 (GAN)
生成对抗网络(Generative Adversarial Networks,GAN)是由Ian Goodfellow等人在2014年提出的一种深度学习模型。GAN由两部分组成:一个生成器(Generator)和一个判别器(Discriminator)&…...
QGridLayout网格布局和QVBoxLayout垂直布局有着非常大的差别
QGridLayout网格布局:1.把这块控件划分成一个个的 单元格 2.把你的控件填充进入 单元格 3.这些有关限制大小的函数接口统统失效 setMaximumWidth() setMinimumWidth() setPolicySize()图示:我是用的网格布局,左边放QT…...
HCIA-HarmonyOS设备开发认证V2.0-习题2
目录 习题一习题二坚持就有收获 习题一 # 判断题## 1.PWM占空比指的是低电平时间占周期时间的百分比。(错误)正确(True)错误(False)解题: - PWM占空比指的是高电平时间占周期时间的百分比## 2.UART是通用异步收发传输器,是通用串行数据总线,…...
【npm】前端工程项目配置文件package.json详解
简言 详细介绍了package.json中每个字段的作用。 package.json 本文档将为您介绍 package.json 文件的所有要求。它必须是实际的 JSON,而不仅仅是 JavaScript 对象文字。 如果你要发布你的项目,这是一个特别重要的文件,其中name和version是…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
