MySQL常见面试题(二)

2023-09-19 08:02:11

😀前言
在数据库管理和操作中,我们常常需要深入理解其各种数据类型、特性和索引类型来优化我们的数据库设计和查询效率。其中,字符串类型和它们如何在MySQL中实现和使用成为了一个必不可少的知识点。同时,我们也需要理解新的特性,如虚拟生成列,它为我们提供了更多的灵活性和优化方案。
.
除此之外,为了保证数据库操作的准确和高效,我们还需要理解事务的基本特性和它可能带来的问题,以及如何通过不同级别的事务隔离来解决这些问题。
.
最后,我们会探讨MySQL中不同的索引类型,这些索引类型为我们提供了多种方式来优化我们的数据库查询。

🏠个人主页:尘觉主页
在这里插入图片描述

🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉

在csdn获奖荣誉: 🏆csdn城市之星2名
⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ 💓Java全栈群星计划top前5
⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ 🤗 端午大礼包获得者
⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ 🥰阿里云专家博主
⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ 😉亚马逊DyamoDB结营

💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰
如果文章有什么需要改进的地方还请大佬不吝赐教 先在次感谢啦😊

谈谈MySQL里的字符串类型

MySQL里的字符串类型有:SET、BLOB、ENUM、VARCHAR、CHAR、TEXT。VARCHAR和 CHAR是两种最主要的字符串类型。VARCHAR类型用于存储可变长字符串,大部分的业务情况下比定长类型更节省空间,CHAR类型是定长的,CHAR适合存储很短的字符串,或者所有值定长或都接近同一个长度。

使用BLOB和TEXT则要慎重,一般把 BLOB或TEXT 列分离到单独的表中,还可以对BLOB或TEXT 列使用合成的(Synthetic)索引,就是根据大文本字段的内容建立一个散列值并单独存储在数据列中,可以通过检索散列值找到数据行。如果表中的字段的取值是固定几个字符串,可以使用枚举列代替常用的字符串类型。

VARCHAR(M)最多能存储多少数据?

对于VARCHAR(M)类型的列最多可以定义65535个字节。其中的M代表该类型最多存储的字符数量,但在实际存储时并不能放这么多。

MySQL对一条记录占用的最大存储空间是有限制的,除了BLOB或者TEXT类型的列之外,其他所有的列(不包括隐藏列和记录头信息)占用的字节长度加起来不能超过65535个字节。所以MySQL服务器建议我们把存储类型改为TEXT或者BLOB的类型。这个65535个字节除了列本身的数据之外,还包括一些其他的数据,从行记录格式我们可以得知,为了存储一个VARCHAR(M)类型的列,其实需要占用3部分存储空间:真实数据、真实数据占用字节的长度、NULL值标识,如果该列有NOT
NULL属性则可以没有这部分存储空间。

我们假设表中只有一个VARCHAR字段的情况:

如果该VARCHAR类型的列没有NOT NULL属性,那最多只能存储65532个字节的数据,因为真实数据的长度可能占用2个字节,NULL值标识需要占用1个字节。

如果VARCHAR类型的列NOT NULL属性,那最多只能存储65533个字节的数据,因为真实数据的长度可能占用2个字节,不需要NULL值标识。

如果VARCHAR(M)类型的列使用的不是ascii字符集,那M的最大取值取决于该字符集表示一个字符最多需要的字节数。在列的值允许为NULL的情况下,gbk字符集表示一个字符最多需要2个字节,那在该字符集下,M的最大取值就是32766(也就是:65532/2),也就是说最多能存储32766个字符;utf8字符集表示一个字符最多需要3个字节,那在该字符集下,M的最大取值就是21844,就是说最多能存储21844(也就是:65532/3)个字符。

不管如何,请牢记:MySQL一个行中的所有列(不包括隐藏列和记录头信息)占用的字节长度加起来不能超过65535个字节

什么是虚拟生成列?

虚拟生成列又叫GeneratedColumn,是MySQL 5.7引入的新特性,就是数据库中这一列由其他列计算而得。在MySQL 5.7中,支持两种Generated
Column,即Virtual
Generated Column(虚拟生成的列)和Stored
Generated Column(存储生成的列),二者含义如下:

1、Virtual
Generated Column(虚拟生成的列):不存储该列值,即MySQL只是将这一列的元信息保存在数据字典中,并不会将这一列数据持久化到磁盘上,而是当读取该行时,触发触发器对该列进行计算显示。

2、Stored
Generated Column(存储生成的列): 存储该列值,即该列值在插入或更新行时进行计算和存储。所以相对于Virtual Column列需要更多的磁盘空间,与Virtual
Column相比并没有优势。因此,MySQL
5.7中,不指定Generated
Column的类型,默认是Virtual
Column

在表中允许Virtual
Column和Stored
Column的混合使用

提高效率:由于mysql在普通索引上加函数会造成索引失效,造成查询性能下降,Generated Column(函数索引)刚好可以解决这个问题,可以在Generated Column加上索引来提高效率。但是不能建立虚拟列和真实列的联合索引,同时虚拟列是不允许创建主键索引和全文索引。

创建虚拟生成列的语法:

CREATE TABLE triangle (

a double DEFAULT NULL,

b double DEFAULT NULL,

sidec double GENERATED
ALWAYS AS (SQRT(a * a + b * b))

) ;

alter table triangle add column sided tinyint(1) generated always as
(a*b) virtual;

请说下事务的基本特性

事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。

原子性指的是一个事务中的操作要么全部成功,要么全部失败。

一致性指的是数据库总是从一个一致性的状态转换到另外一个一致性的状态。比如A转账给B100块钱,假设中间sql执行过程中系统崩溃A也不会损失100块,因为事务没有提交,修改也就不会保存到数据库。

隔离性指的是一个事务的修改在最终提交前,对其他事务是不可见的。

持久性指的是一旦事务提交,所做的修改就会永久保存到数据库中。

事务并发可能引发什么问题?

当一个事务读取到了另外一个事务修改但未提交的数据,被称为脏读。

当事务内相同的记录被检索两次,且两次得到的结果不同时,此现象称为不可重复读。

在事务执行过程中,事务2将新记录添加到正在读取的事务1中,导致事务1按照某个相同条件多次读取记录时,后读取时读到了之前没有读到的记录,发生幻读。

事务2中是删除了符合的记录而不是插入新记录,那事务1中之后再根据条件读取的记录变少了,在MySQL中这种现象不属于幻读,相当于对每一条记录都发生了不可重复读的现象。

请描述下MySQL中InnoDB支持的四种事务隔离和区别

read uncommitted:未提交读,可能发生脏读、不可重复读和幻读问题。

read committed:提交读,可能发生不可重复读和幻读问题,但是不会发生脏读问题。

repeatable read:可重复读,在SQL标准中可能发生幻读问题,但是不会发生脏读和不可重复读的问题,但是MySQL通过MVCC基本解决了幻读问题。这也是MySQL的缺省隔离级别。

serializable:串行化读,脏读、不可重复读和幻读问题都不会发生。

MySQL有哪些索引类型

从数据结构角度可分为B+树索引、哈希索引、以及FULLTEXT索引(现在MyISAM和InnoDB引擎都支持了)和R-Tree索引(用于对GIS数据类型创建SPATIAL索引);

从物理存储角度可分为聚集索引(clustered index)、非聚集索引(non-clustered index);

从逻辑角度可分为主键索引、普通索引,或者单列索引、多列索引、唯一索引、非唯一索引等等。

😄总结

通过深入探讨MySQL中的字符串类型和虚拟生成列,我们不仅加深了对这些基本概念的理解,还学到了如何更好地使用它们来优化我们的数据库设计。

我们也学习了事务的ACID特性和它在保持数据库一致性和安全性方面的重要性。通过理解不同级别的事务隔离,我们可以更好地解决事务并发可能带来的问题,如脏读、不可重复读和幻读。

最后,我们对MySQL中的不同索引类型进行了探讨,了解了如何利用这些索引来优化我们的数据库查询,提高查询效率和准确性。

总的来说,这些深入的洞察为我们提供了一套全面的工具和策略来更好地设计和管理我们的MySQL数据库,确保它们不仅高效,而且可靠和安全。

😁热门专栏推荐
想学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

更多推荐

Java 21正式发布了,来来来,一睹它的芳容!

Oracle高兴地宣布JDK21已经正式上线了。这是按照每六个月一次的发布计划,准时推出的第12个版本。这种定期的发布模式为开发者提供了稳定和可预见的创新,使得他们可以轻松地接纳和采用这些新特性。Java由于其出色的性能、稳定性和安全性使其持续成为全球最受欢迎的编程语言。#01JDK21已经正式发布Oracle现已为开

ElasticSearch:文章检索

实现目标思路与ES前期准备使用postman添加映射put请求:搜索结果展示内容:标题、布局、枫叶图片、发布时间、作者名称、文章id、作者id、静态url需要对:内容、标题进行分词json"content":{"type":"text","ananlyze":"ik_smart"}http://${url}:${por

重构Transformer神经网络:优化的自注意力机制和前馈神经网络

重构Transformer神经网络:优化的自注意力机制和前馈神经网络原文代码网络结构推理代码训代码数据处理代码长词表辅助代码原文标题:重构Transformer神经网络:优化的自注意力机制和前馈神经网络摘要:本论文研究了一种改进的Transformer神经网络模型,该模型使用区别于传统自注意力机制的新型注意力机制,以及

湖南长沙石雕石质文物三维扫描数字化雕刻3D打印复刻文化遗产-CASAIM中科广电

石质文物主要包括石雕、石塔和古建筑等,颇具代表性的雕刻动物作品有:龙、凤、狮子、麒麟、貔貅、金蟾等。石雕是我国文化遗产的重要组成,在书写灿烂文明中扮演着重要角色,记载了我国文化和历史的变迁。随着现代艺术的发展,雕塑艺术作品创作风格和形式呈现多元化的趋势,CASAIM三维数字化越来越多地被应用到雕塑艺术品的复刻、修复、展

不相同的字符串(挑战字符串中的算法)

此题不容易考虑全部情况,对于未出现字母不够的情况,需要自己模拟假设一下,才会发现处理方法的玄妙//分析题目不难发现,这道题其实和字符具体长啥样没关系//只和字母的个数有关系,所以我们只需统计字母的个数//总体思路分两个情况//第一个情况,若有不存在的字母//例如abab,除ab以外的字母都不存在,可以将两个a转化为单个

LeetCode_队列_中等_649.Dota2 参议院

目录1.题目2.思路3.代码实现(Java)1.题目Dota2的世界里有两个阵营:Radiant(天辉)和Dire(夜魇)Dota2参议院由来自两派的参议员组成。现在参议院希望对一个Dota2游戏里的改变作出决定。他们以一个基于轮为过程的投票进行。在每一轮中,每一位参议员都可以行使两项权利中的一项:禁止一名参议员的权利

基于Java的Base64编解码优化探讨

🌷🍁博主猫头虎带您GotoNewWorld.✨🍁🦄博客首页——猫头虎的博客🎐🐳《面试题大全专栏》文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大

js 事件流、事件冒泡、事件捕获、阻止事件的传播

事件流js事件的执行过程分为捕获阶段(由外层节点传播到内层节点)和冒泡阶段(由内层节点传播到外层节点),即先执行捕获阶段的代码,后执行冒泡阶段的代码事件冒泡js事件中的代码默认在冒泡阶段执行,以下图为例,点击box2时,会依次触发box2的点击事件【冒泡阶段执行】、box1的点击事件【冒泡阶段执行】、window的点击

ubuntu中如何用docker下载华为opengauss数据库(超简单)

ubuntu中如何下载华为opengauss数据库前言一、安装docker1.方法一:2.方法二二、拉取openguass镜像三、创建容器四、连接数据库,切换到omm用户,用gsql连接到数据库五.最后用DateGrip远程连接测试(1)选择数据源(2)查看虚拟机ip地址(3)远程连接测试前言openGauss是一款全

家居行业如何借助AI营销数智化转型?《2023 家居行业AI营销第一课(重庆站)》给你答案

商务部将2023年定为“消费提振年”。作为仅次于汽车消费的家庭第二大消费支出,家居产业的高质量发展与扩大内需提振消费息息相关。随着今年利好政策不断发布,家居建材行业的市场环境及消费潜力得到大幅度改善。随着ChatGPT等新技术的出现与消费需求升级的趋势,近年来,家居建材行业数智化转型趋势越来越明显,家居行业的品牌营销也

基于SSM+Vue的网络教学平台的设计与实现的设计与实现

末尾获取源码开发语言:JavaJava开发工具:JDK1.8后端框架:SSM前端:采用Vue技术开发数据库:MySQL5.7和Navicat管理工具结合服务器:Tomcat8.5开发软件:IDEA/Eclipse是否Maven项目:是目录一、项目简介二、系统功能三、系统项目截图学生功能模块的实现管理员功能模块的实现教师

热文推荐