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

【MySQL】MySql常见面试题总结

目录

一、什么是sql注入

二、sql语句的执行流程

三、内连接和外连接的区别

四、Union和Union All 有什么区别

五、MySql如何取差集

六、DELETE和TRUNCATE有什么区别

七、count(*)和count(1)的区别

八、MyISAM和InnoDB的区别

九、行级锁和表级锁

十、InnoDB存储引擎的三种行级锁

十一、谈谈对事务的理解

十二、谈谈数据库事务的实现原理

十三、什么是MVCC

十四、数据库并发事务会带来哪些问题

十五、事务的隔离级别

十六、谈谈对索引的理解

十七、索引的优缺点

十八、谈谈对B+Tree的理解

十九、谈谈MySql中的索引

二十、为什么选择B+Tree

二十一、BTree和B+Tree的主要区别

二十二、索引优化

二十三、MySql索引在什么情况下会失效

二十四、SQL优化


一、什么是sql注入

sql注入是指攻击者通过对用户输入的字符串内容加入sql语句,与程序中sql进行拼接,形成恶意查询,非法命令等攻击手段。一般使用 ?占位符来避免sql注入。


二、sql语句的执行流程

通过MySql连接器,建立Tcp连接,进行用户密码的验证和权限的校验。

通过授权认证后,对sql语句进行语义分析,判断是否语法正确。

对sql语句进行预处理,sql预编译。

执行查询优化器来获取最优执行路径。

通过索引或者全表查询。


三、内连接和外连接的区别

内连接是指只获取两表都符合条件的数据。

而外连接除了符合条件的数据,还有左表数据、右表数据、两个连接表中所有数据,外连接分为

        左外连接是指左表所有数据保留右表保留符合条件的数据,通过left join。

        右外连接是指右表所有数据保留左表保留符合条件的数据,通过right join。

        全外连接是指保留所有行,通过full join。


四、Union和Union All 有什么区别

Union是指对两个结果集不包含重复项 Union ALL包含重复项


五、MySql如何取差集

当对比字段存在索引时,使用NOT EXISTS 效率高

没有索引时,使用LEFT JOIN 或者RIGHT JOIN效率高


六、DELETE和TRUNCATE有什么区别

首先delete语句可以接条件,truncate不行。

delete逐条删除的,每条数据都会写入日志,而truncate按数据页删的,只记录页释放。

delete删除后会保留空数据页truncate因为是按页删除的所以不会保留数据页。

如果该表存在id自增的话,delete后会继续上次的数自增,而truncate从1开始。


七、count(*)和count(1)的区别

count(1)就是把查询结果替换成1count(*)是查询所有字段。

count(1)效率要比count(*)高。


八、MyISAM和InnoDB的区别

MyISAMmysql5.5之前默认的存储引擎InnoDB是5.5之后默认的。

MyISAM不支持事务的,而InnoDB支持。

MyISAM只支持表级锁,而InnoDB支持行级锁和表级锁,默认为行级锁。

MyISAM不支持外键InnoDB支持。


九、行级锁和表级锁

表级锁是对整张表加锁,实现简单消耗资源少加锁快不会出现死锁。但触发锁冲突的概率也大,并发度低MyISAMInnoDB存储引擎都支持表级锁

行级锁是对当前操作的行进行加锁,他的并发度高加锁慢消耗资源多可能发生死锁。


十、InnoDB存储引擎的三种行级锁

记录锁是指在单个行上加锁

间隙锁是指锁定一个范围,不包含记录本身。

临键锁是他两相加,锁定一个范围,包含记录本身


十一、谈谈对事务的理解

事务是数据库的一种特性,包括ACID四个特点:

原子性代表事务是数据库的最小执行单元。用于确保一个执行过程中所有步骤全部成功或失败。

一致性:指在进行修改操作时,要求数据在修改前修改后状态保持一致。

隔离性:是指在一个事务执行时不能被其他事务干扰。

持久性:是指一个事务一旦被提交数据的改变时永久的。


十二、谈谈数据库事务的实现原理

InnoDB是通过重做日志来保证事务的持久性。

通过回滚日志来保证事务的原子性。

通过锁机制、MVCC等手段保证事务的隔离性

保证了事务的持久性、原子性、隔离性后一致性才得以保障。


十三、什么是MVCC

MVCC行级锁的一个变种,它能够减少加锁操作,因此开销更低,大多数MVCC都实现了非阻塞的读操作,写操作也只锁定必要行

MVCC是一种用来解决读写冲突的并发控制为事务分配单项增长的时间戳为每个修改保存一个版本每个版本对应一个时间戳每个事务都有对应一个版本快照快照版本按照时间戳来决定先后顺序

读操作,只需要去读该事务开始前的最新数据快照。


十四、数据库并发事务会带来哪些问题

脏读:是指一个事务访问并修改这个数据时另一个事务访问了这个数据,因为修改的事务还没提交。就会导致读取的结果可能不正确。从而导致脏读。

不可重复读:是指在一个事务中多次读取同一个数据,而在其中两次读取数据之间,另一个事务对该数据进行了修改,从而导致两次读取数据不同

丢失数据:是指两个事务同时修改一个数据导致其中一个修改的结果就被丢失

幻读:是指在一个事务读取几行数据后,另一个事务增加了一些数据,而当第一个事务再次读取数据时,发现多了一些原本不存在的数据


十五、事务的隔离级别

读未提交最低隔离级别,允许读取尚未提交的数据。可能会导致脏读、幻读、不可重复读。

读已提交Oracle默认隔离级别只能读取已经提交的数据,可以避免脏读,但可能会造成幻读和不可重复读。

可重复读MySql默认隔离级别,指一个事务中读一个数据的多次读取结果是一致的,除非这个事务本身修改过这个数据,可以避免脏读不可重复读,可能发生幻读。

串行化最高隔离级别将所有事务挨个执行,可以避免脏读、幻读、不可重复读。


十六、谈谈对索引的理解

索引是一种用于快速查询或检索数据的数据库存储结构,保存了数据库指定字段的数据位置。

常见的索引有B+Tree索引和Hash索引

索引主要用提高数据库查询效率,如果使用索引可以通过索引快速查找表中对应记录

 索引按照逻辑区别大致分为主键索引唯一索引普通索引全文索引。按照字段分别单例索引组合索引


十七、索引的优缺点

索引的优点肯定是加快查找速率减少数据库需要扫描的数据行。通过唯一索引保证数据库每行的唯一性。

缺点则是创建索引维护索引消耗时间和资源,在进行增删改的同时,也会对索引进行修改,导致sql执行效率也会降低。索引还会占用多余存储空间


十八、谈谈对B+Tree的理解

B+Tree的话是对BTree的一个变种,他是MySql默认索引类型。他的所有节点都是按照递增顺序排列,按照左小右大原则,所有数据都是存放在叶子节点上,每一个叶子节点上都有一个指向下一个叶子节点的指针,形成有序链表。

查询数据时,首先先在根节点上进行二分查找,找到对应的叶子节点,在进行二分查找,找到key所对应的数据。

区间查找时,由于叶子节点形成了有序链表,所以可以通过指针遍历相邻叶子结点提高查询效率。


十九、谈谈MySql中的索引

除了上面的B+Tree索引还有一个常用索引Hash索引

他是基于hash表实现的一种索引结构,通过hash算法来计算字段哈希值,来找到对应数据。所以他的时间复杂度O(1)

无法用于排序、分组、范围查找。只支持精确查找

InnoDB存储引擎中有一个特殊功能叫自适应哈希索引,当某个索引值使用频繁时,他会在B+Tree索引之上建一个hash索引,以此来获得hash索引的优点


二十、为什么选择B+Tree

全表扫描能力强因为子节点存在有序链表,可以直接通过链表遍历

支持排序分组。

查询时更加稳定因为数据只保存在叶子节点上。

读写能力强。他的根节点和枝节点不保存数据,所以根枝同样大小的情况下,保存的关键字要比BTree要多。所以读一次磁盘加载关键字也比BTree多。


二十一、BTree和B+Tree的主要区别

首先BTree他的数据是存放在所有节点中,而B+Tree只在叶子结点中。

BTree在查找时可能在任何节点停止,而B+Tree只会在叶子节点中,更加稳定。

B+Tree的叶子节点形成一条有序链表,能够提高查询速率。

B+Tree区间查找更胜一筹。


二十二、索引优化

可以通过对选择索引的字段来进行优化

        尽量不选择数据大多为NULL的字段,如果必须要用,建议使用0、1、true、false来代替。

        可以考虑被where条件查询的字段建立索引。

        频繁需要排序的字段建立索引。

        频繁用于连接的字段建立索引。

频繁需要更新的字段且又不常查询建议不要索引。因为每次更新数据都需要同步更新索引,需要消耗资源。

尽量多使用联合索引而不是单例索引。因为一个联合索引可以代替多个单例索引,能够减少空间,维护的时间。

注意避免冗余索引,比如一个联合索引已经包括一个单例索引,但还是建了这个单例索引

字符串类型的字段建议使用前缀索引而不是普通索引,因为前缀索引占用空间更小。

避免where子句中对所有字段使用函数,容易导致索引失效。


二十三、MySql索引在什么情况下会失效

模糊查询时使用%开头会导致索引失效。

组合索引中包含不包含最左边字段索引会失效。

组合索引中范围搜索后的字段索引会失效。

数据类型不匹配导致索引失效。

使用!=、<、>、not in 运算会失效。

字段内容为null,导致索引失效。

or前后的条件有一个不包含索引会失效。

添加索引的字段上使用函数或者计算,会导致索引失效。


二十四、SQL优化

禁止使用select *必须使用select 字段进行查询,在SQL中明确查询字段名称。

考虑在where和order by的字段建立索引。

使用 explain语句,观察sql执行计划。

防止索引失效,第二十三条所有。


注:本篇文章都是我自己的理解,可能用词和语句不够严谨,如有错误请评论指正,谢谢!(持续更新中......)

相关文章:

【MySQL】MySql常见面试题总结

目录 一、什么是sql注入 二、sql语句的执行流程 三、内连接和外连接的区别 四、Union和Union All 有什么区别 五、MySql如何取差集 六、DELETE和TRUNCATE有什么区别 七、count&#xff08;*&#xff09;和count&#xff08;1&#xff09;的区别 八、MyISAM和InnoDB的区…...

【Java 进阶篇】JDBC PreparedStatement 详解

在Java中&#xff0c;与关系型数据库进行交互是非常常见的任务之一。JDBC&#xff08;Java Database Connectivity&#xff09;是Java平台的一个标准API&#xff0c;用于连接和操作各种关系型数据库。其中&#xff0c;PreparedStatement 是 JDBC 中一个重要的接口&#xff0c;用…...

嵌入式Linux应用开发-驱动大全-第一章同步与互斥①

嵌入式Linux应用开发-驱动大全-第一章同步与互斥① 第一章 同步与互斥①1.1 内联汇编1.1.1 C语言实现加法1.1.2 使用汇编函数实现加法1.1.3 内联汇编语法1.1.4 编写内联汇编实现加法1.1.5 earlyclobber的例子 1.2 同步与互斥的失败例子1.2.1 失败例子11.2.2 失败例子21.2.3 失败…...

【计算机网络】 基于UDP的简单通讯(客户端)

文章目录 客户端流程代码实现添加头文件以及库依赖加载库创建套接字发送接收数据关闭套接字、卸载库 测试 客户端 流程 客户端跟服务端差不多&#xff0c;也要先加载库&#xff0c;在加载库之后也要创建套接字&#xff0c;但是客户端一定是没有绑定ip地址的&#xff0c;之后是…...

【云备份项目】:环境搭建(g++、json库、bundle库、httplib库)

文章目录 1. g 升级到 7.3 版本2. 安装 jsoncpp 库3. 下载 bundle 数据压缩库4. 下载 httplib 库从 Win 传输文件到 Linux解压缩 1. g 升级到 7.3 版本 &#x1f517;链接跳转 2. 安装 jsoncpp 库 &#x1f517;链接跳转 3. 下载 bundle 数据压缩库 安装 git 工具 sudo yum…...

电脑右键新建记事本不见了--设置恢复篇(无需操作注册表)

电脑右键新建记事本不见了–设置恢复篇&#xff08;无需修改注册表&#xff09; 电脑不知怎么想右键新建记事本结果竟然不见了&#xff0c;搜寻网上的都是什么修改注册表&#xff0c;粘贴代码修复&#xff08;感觉太复杂了&#xff09;&#xff0c;这里介绍通过设置内重新对记…...

JavaScript内置对象 - Array数组(四)- 序列生成器

序列生成器是生成一个指定起始值和结束值的序列&#xff0c;并且根据指定间隔长度&#xff0c;生成序列数组。 完成此功能需要使用到Array内置对象的from()对象&#xff0c;以及类数组相关知识&#xff0c;前面几篇有相关案例进行演示。 地址一&#xff1a;JavaScript内置对象…...

GD32F103x IIC通信

1. IIC通信 1.IIC的介绍 IIC总线有两条串行线&#xff0c;其一是时钟线SCK&#xff08;同步&#xff09;&#xff0c;其二是数据线SDA。只有一条数据线属于半双工。应用中&#xff0c;单片机常常作为主机&#xff0c;外围器件可以挂载多个。&#xff08;当然主机也可以有多个。…...

什么是FOSS

FOSS 是指 自由和开放源码软件(Free and Open Source Software)。这并不意味着软件是免费的。它意味着软件的源代码是开放的&#xff0c;任何人都可以自由使用、研究和修改代码。这个原则允许人们像一个社区一样为软件的开发和改进做出贡献。...

C++语言GDAL批量裁剪多波段栅格图像:基于像元个数裁剪

本文介绍基于C 语言的GDAL模块&#xff0c;按照给定的像元行数与列数&#xff0c;批量裁剪大量多波段栅格遥感影像文件&#xff0c;并将所得到的裁剪后新的多波段遥感影像文件保存在指定路径中的方法。 在之前的文章中&#xff0c;我们多次介绍了在不同平台&#xff0c;或基于不…...

简单丝的tab切换栏(html/CSS)

#html <!DOCTYPE html> <html lang"en" > <head><meta charset"UTF-8"><title>CSS实现左右滑动选项卡效果</title><link rel"stylesheet" href"https://cdnjs.cloudflare.com/ajax/libs/meyer-res…...

LabVIEW开发带式谱感测技术

LabVIEW开发带式谱感测技术 如今&#xff0c;通过无线网络传输的数据量正在迅速增加&#xff0c;并导致频谱稀缺。超过数十亿的无线设备将被连接起来&#xff0c;并需要互联网接入。因此&#xff0c;无线电频谱管理方案的效率不足以授予对所有设备的访问权限。在频谱分配中&am…...

认识柔性数组

在C99中&#xff0c;结构中的最后一个元素允许是未知大小的数组&#xff0c;这就叫做柔性数组成员 限制条件是&#xff1a; 结构体中最后一个成员未知大小的数组 1.柔性数组的形式 那么我们怎样写一个柔性数组呢 typedef struct st_type {int i;int a[0];//柔性数组成员 }ty…...

熔断、限流、降级 —— SpringCloud Alibaba Sentinel

Sentinel 简介 Sentinel 是阿里中间件团队开源的&#xff0c;面向分布式服务架构的高可用流量防护组件&#xff0c;主要以流量为切入点&#xff0c;从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性 Sentinel 提供了两个服务组件…...

python经典百题之反向输出数字

题目:输入一个整数&#xff0c;并将其反转后输出。 程序分析 我们需要对输入的整数进行反转&#xff0c;即将整数的数字反向排列。 方法1&#xff1a;使用字符串反转 解题思路 将整数转换为字符串&#xff0c;然后对字符串进行反转。 代码实现 def reverse_integer_usin…...

复习Day08:哈希表part01:242.有效的字母异位词、349. 两个数组的交集、1. 两数之和、160. 相交链表

之前的blog&#xff1a;https://blog.csdn.net/weixin_43303286/article/details/131765317 我用的方法是在leetcode再过一遍例题&#xff0c;明显会的就复制粘贴&#xff0c;之前没写出来就重写&#xff0c;然后从拓展题目中找题目来写。辅以Labuladong的文章看。然后刷题不用…...

用 Pytest+Allure 生成漂亮的 HTML 图形化测试报告

本篇文章将介绍如何使用开源的测试报告生成框架 Allure 生成规范、格式统一、美观的测试报告。 通过这篇文章的介绍&#xff0c;你将能够&#xff1a; 将 Allure 与 Pytest 测试框架相结合&#xff1b; 如何定制化测试报告内容 执行测试之后&#xff0c;生成 Allure 格式的测…...

Python字符串索引解码乱码谜题

输入数行“数字字母”字符组成的乱码字符串&#xff0c;根据谜题规则解码出乱码字符串中隐藏的单词信息。 (本笔记适合熟悉python字符串索引操作的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”…...

协议栈——收发数据(拼接网络包,自动重发,滑动窗口机制)

目录 协议栈何时发送数据&#xff5e; 数据长度 IP模块的分片功能 发送频率 网络包序号&#xff5e;利用syn拼接网络包ack确认网络包完整 确定偏移量 服务器ack确定收到数据总长度 序号作用 双端告知各自序号 协议栈自动重发机制 大致流程 ack等待时间如何调整 是…...

传输层协议——TCP、UDP

目录 1、UDP 协议&#xff08;用户数据报协议&#xff09; 协议特点 报文首部格式 2、TCP 协议&#xff08;传输控制协议&#xff09; 协议特点 报文首部格式 TCP连接建立时的三次握手 TCP拆除连接的四次挥手 TCP的流量控制 TCP的拥塞控制 3、传输层端口号 三类端口…...

COMSOL中固态锂离子电池的电-热-力耦合仿真:考虑扩散诱导应力、热应力及外部挤压应力的影响

COMSOL 固态锂离子电池仿真 固态锂离子电池电-热-力耦合仿真&#xff0c;考虑了扩散诱导应力&#xff0c;热应力以及外部挤压应力。固态电池鼓包变形的时候&#xff0c;工程师老张盯着屏幕上的应力云图直挠头。这玩意儿明明充满电就膨胀&#xff0c;放完电又缩回去&#xff0c;…...

深度学习中的优化器:原理与实践

深度学习中的优化器&#xff1a;原理与实践 一、背景与动机 在深度学习中&#xff0c;优化器是模型训练的核心组件&#xff0c;它决定了模型参数如何根据损失函数的梯度进行更新。选择合适的优化器对于模型的训练速度和最终性能至关重要。本文将深入探讨各种优化器的核心原理、…...

ChromePass终极指南:浏览器密码提取与安全管理完全攻略

ChromePass终极指南&#xff1a;浏览器密码提取与安全管理完全攻略 【免费下载链接】chromepass Get all passwords stored by Chrome on WINDOWS. 项目地址: https://gitcode.com/gh_mirrors/chr/chromepass 副标题&#xff1a;从密码危机到数据掌控&#xff1a;3步实现…...

5分钟搞定三网话费余额查询:手把手教你用PHP+HTML搭建查询系统(含API调用避坑指南)

三网话费查询系统开发实战&#xff1a;从API调用到前端优化的全流程指南 最近在帮朋友开发一个小型话费查询工具时&#xff0c;发现市面上关于三网运营商API调用的完整教程并不多见。大多数开发者遇到问题时只能靠反复试错&#xff0c;特别是当需要同时对接移动、联通、电信三家…...

reyax_lora轻量级LoRa模块串口驱动库设计与应用

1. 项目概述reyax_lora是一个面向嵌入式平台的轻量级串口驱动库&#xff0c;专为控制 Reyax 公司 RYLR998&#xff08;433/470/868/915 MHz&#xff09;与 RYLR498&#xff08;2.4 GHz&#xff09;LoRa 透传模块而设计。该库不依赖操作系统抽象层&#xff0c;以裸机&#xff08…...

开源条码字体技术:如何通过字体文件彻底改变条码生成方式

开源条码字体技术&#xff1a;如何通过字体文件彻底改变条码生成方式 【免费下载链接】librebarcode Libre Barcode: barcode fonts for various barcode standards. 项目地址: https://gitcode.com/gh_mirrors/li/librebarcode 条码生成技术长期以来依赖专业软件和专用…...

WarcraftHelper:魔兽争霸3终极优化指南 - 解锁现代硬件性能

WarcraftHelper&#xff1a;魔兽争霸3终极优化指南 - 解锁现代硬件性能 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper WarcraftHelper是一款专为魔兽…...

Simulink三相变压器模块深度解析:从参数配置到电力系统仿真实战

1. 三相变压器模块的核心功能解析 Simulink中的Three-Phase Transformer模块就像电力系统的"翻译官"&#xff0c;专门负责处理三相交流电的电压转换和相位调整。我在电力电子项目中最常使用的就是这个模块&#xff0c;因为它能完美还原真实变压器的各种"脾气秉…...

all-MiniLM-L6-v2实战教程:用Python快速实现文本聚类分析

all-MiniLM-L6-v2实战教程&#xff1a;用Python快速实现文本聚类分析 1. 引言&#xff1a;为什么选择all-MiniLM-L6-v2 文本聚类是自然语言处理中的基础任务&#xff0c;它能帮助我们发现海量文本中的隐藏模式。传统方法如TF-IDF或词袋模型往往难以捕捉语义信息&#xff0c;而…...

探索:空间网格编码SpatialGridCoding在北斗导航与地理实体管理中的应用

1. 空间网格编码&#xff1a;北斗导航的"数字身份证" 想象一下&#xff0c;当你打开手机导航时&#xff0c;系统如何快速锁定你的位置并规划路线&#xff1f;这背后离不开空间网格编码技术的支持。简单来说&#xff0c;空间网格编码就像给地球表面贴满二维码&#xf…...