杨校老师课堂之MySQL数据库面试题【开发工程师面试前必看】

news2025/1/17 1:09:57

1.说一说三大范式

「第一范式」:数据库中的字段具有「原子性」,不可再分,并且是单一职责


「第二范式」:「建立在第一范式的基础上」,第二范式要求数据库表中的每个实例或行必须「可以被惟一地区分」。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主键>


「第三范式」:「建立在第一,第二范式的基础上」,确保每列都和主键列直接相关,而不是间接相关不存在其他表的非主键信息


但是在我们的日常开发当中,「并不是所有的表一定要满足三大范式」,有时候冗余几个字段可以少关联几张表,带来的查询效率的提升有可能是质变的

2.MyISAM 与 InnoDB 的区别是什么?

在这里插入图片描述

1.「 InnoDB支持事务,MyISAM不支持」。 「InnoDB 支持外键,而 MyISAM 不支持」。
2. 「InnoDB是聚集索引」,使用B+Tree作为索引结构,数据文件是和索引绑在一起的,必须要有主键。「MyISAM是非聚集索引」,也是使用B+Tree作为索引结构,索引和数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
3. 「InnoDB 不保存表的具体行数」。
4. 「MyISAM 用一个变量保存了整个表的行数」。
5. Innodb 有 「redolog」日志文件,MyISAM 没有
6. 「Innodb存储文件有frm、ibd,而Myisam是frm、MYD、MYI」

  • Innodb:frm是表定义文件,ibd是数据文件
  • Myisam:frm是表定义文件,myd是数据文件,myi是索引文件
  1. 「InnoDB 支持表、行锁,而 MyISAM 支持表级锁」
  2. 「InnoDB 必须有唯一索引(主键)」,如果没有指定的话 InnoDB 会自己生成一个隐藏列Row_id来充当默认主键,「MyISAM 可以没有」

3.为什么推荐使用自增 id 作为主键?

在这里插入图片描述

1.普通索引的 B+ 树上存放的是主键索引的值,如果该值较大,会「导致普通索引的存储空间较大」


2.使用自增 id 做主键索引新插入数据只要放在该页的最尾端就可以,直接「按照顺序插入」,不用刻意维护


3.页分裂容易维护,当插入数据的当前页快满时,会发生页分裂的现象,如果主键索引不为自增 id,那么数据就可能从页的中间插入,页的数据会频繁的变动,「导致页分裂维护成本较高」


4.一条查询语句是怎么执行的?

在这里插入图片描述

1.通过连接器跟客户端「建立连接」
2.通过查询「缓存查询」之前是否有查询过该 sql 有则直接返回结果 没有则执行第三步
3.通过分析器「分析该 sql 的语义」是否正确,包括格式,表等等
4.通过优化器「优化该语句」,比如选择索引,join 表的连接顺序
5.「验证权限」,验证是否有该表的查询权限

  • 没有则返回无权限的错误
  • 有则执行第六步

6.通过执行器调用存储引擎执行该 sql,然后返回「执行结果」


5. 什么是索引?

相信大家小时候学习汉字的时候都会查字典,想想你查字典的步骤,我们是通过汉字的首字母 a~z
一个一个在字典目录中查找,最终找到该字的页数。想想,如果没有目录会怎么样,最差的结果是你有可能翻到字典的最后一页才找到你想要找的字。

索引就「相当于我们字典中的目录」,可以极大的提高我们在数据库的查询效率。


6.索引失效的场景有哪些?

以下随便列举几个,不同版本的 mysql 场景不一

1.最左前缀法则(带头索引不能死,中间索引不能断


2.不要在索引上做任何操作(计算、函数、自动/手动类型转换),不然会导致索引失效而转向全表扫描


3.不能继续使用索引中范围条件(bettween、<、>、in等)右边的列,如:


select a from user where c > 5 and b = 4;
4.索引字段上使用(!= 或者 < >)判断时,会导致索引失效而转向全表扫描


5.索引字段上使用 is null / is not null 判断时,会导致索引失效而转向全表扫描。


6.索引字段使用like以通配符开头(‘%字符串’)时,会导致索引失效而转向全表扫描,也是最左前缀原则。


7.索引字段是字符串,但查询时不加单引号,会导致索引失效而转向全表扫描


8.索引字段使用 or 时,会导致索引失效而转向全表扫描


什么是最左前缀原则

最左前缀其实说的是,在 where
条件中出现的字段,「如果只有组合索引中的部分列,则这部分列的触发索引顺序」,是按照定义索引的时候的顺序从前到后触发,最左面一个列触发不了,之后的所有列索引都无法触发。

比如「有一个 (a,b,c) 的组合索引」

where a = 1 and b = 1 此时 a,b 会命中该组合索引

where a = 1 and c = 1此时 a 会命中该组合索引, c 不会

where b = 1 and c = 1 此时不会命中该组合索引


普通索引和唯一索引该怎么选择?

查询 当普通索引为条件时查询到数据会一直扫描,直到扫完整张表 当唯一索引为查询条件时,查到该数据会直接返回,不会继续扫表


更新 普通索引会直接将操作更新到 change buffer 中,然后结束 唯一索引需要判断数据是否冲突


所以「唯一索引更加适合查询的场景,普通索引更适合插入的场景」


什么是事务?其特性是什么?

事务是指是程序中一系列操作必须全部成功完成,有一个失败则全部失败。

特性:
「1.原子性(Atomicity)」:要么全部执行成功,要么全部不执行。
「2.一致性(Consistency)」:事务前后数据的完整性必须保持一致。
「3.隔离性(Isolation)」:隔离性是当多个事务同事触发时,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
「4.持久性(Durability)」:事务完成之后的改变是永久的。


事务的隔离级别?

1.「读提交」:即能够「读取到那些已经提交」的数据


2.「读未提交」:即能够「读取到没有被提交」的数据


3.「可重复读」:可重复读指的是在一个事务内,最开始读到的数据和事务结束前的「任意时刻读到的同一批数据都是一致的」


4.「可串行化」:最高事务隔离级别,不管多少事务,都是「依次按序一个一个执行」
在这里插入图片描述

  • 「脏读」
    • 脏读指的是·「读到了其他事务未提交的数据」,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并一定最终存在的数据,这就是脏读
  • 「不可重复读」
    • 对比可重复读,不可重复读指的是在同一事务内,「不同的时刻读到的同一批数据可能是不一样的」
  • 「幻读」
    • 幻读是针对数据插入(INSERT)操作来说的。假设事务A对某些行的内容作了更改,但是还未提交,此时事务B插入了与事务A更改前的记录相同的记录行,并且在事务A提交之前先提交了,而这时,在事务A中查询,会发现「好像刚刚的更改对于某些数据未起作用」,但其实是事务B刚插入进来的这就叫幻读

说说你的 Sql 调优思路吧

在这里插入图片描述

1.「表结构优化」

  • 拆分字段
  • 字段类型的选择
  • 字段类型大小的限制
  • 合理的增加冗余字段
  • 新建字段一定要有默认值

2.「索引方面」

  • 索引字段的选择
  • 利用好mysql支持的索引下推,覆盖索引等功能
  • 唯一索引和普通索引的选择

3.「查询语句方面」

  • 避免索引失效
  • 合理的书写where条件字段顺序
  • 小表驱动大表
  • 可以使用force index()防止优化器选错索引

4.「分库分表」

在这里插入图片描述

作者: 杨校

出处: https://mryang.blog.csdn.net

分享是快乐的,也见证了个人成长历程,文章大多都是工作经验总结以及平时学习积累,基于自身认知不足之处在所难免,也请大家指正,共同进步。

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 如有问题, 可邮件(397583050@qq.com)咨询

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

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

相关文章

Rasa 基于规则的对话管理: 天气预报机器人

文章目录1. fallbackNLU fallback2. 意图触发动作3. 表单定义表单激活表单执行表单任务4. 天气预报机器人nlu.ymlstories.ymlrules.ymlcities.ymldomain.ymlconfig.ymlendpoints.ymlcredentials.ymlactions.py测试learn from https://github.com/Chinese-NLP-book/rasa_chinese…

Keras深度学习实战(40)——音频生成

Keras深度学习实战&#xff08;40&#xff09;——音频生成0. 前言1. 模型与数据集分析1.1 数据集分析1.2 模型分析2. 音频生成模型2.1 数据集加载与预处理2.2 模型构建与训练小结系列链接0. 前言 我们已经在《文本生成模型》一节中学习了如何利用深度神经网络生成文本&#x…

智能、人机融合智能和深度态势感知

内容摘要&#xff1a;人工智能的符号主义、联结主义和行为主义三大学派&#xff0c;分别从不同角度切入智能的本质&#xff0c;其研究观点相互补充但各有局限。在人机融合过程中&#xff0c;怎样进行人机功能分配&#xff0c;人机怎样融合学习、理解、决策、推理乃至感知。数据…

获取微信公众号token

access_token是公众号的全局唯一接口调用凭据&#xff0c;公众号调用各接口时都需使用access_token 接口调用请求说明 https请求方式: GET https://api.weixin.qq.com/cgi-bin/token?grant_typeclient_credential&appidAPPID&secretAPPSECRET参数说明 参数是否必填说…

牛!单表千万行数据库: LIKE 搜索优化手记

我们可以在 txt 列上建立索引&#xff0c;用于优化该查询&#xff1a; CREATE INDEX tbl_like_txt_idx ON [tbl_like] ( [txt] ) 应用索引后&#xff0c;查询速度大大加快&#xff0c;仅需 5 毫秒&#xff1a; 由此可知&#xff1a;对于左前缀匹配&#xff0c;我们可以通过增…

市政工控典型安全解决方案

汽车制造业 MES系统 DNC系统 生产 安全域1 管理层 工控安全隔离装置 交换机 安全配置核查系统 HMI 历史数据库 运行监控系统 实时数据库 打印机过程 安全域2 监控层 工控漏洞扫描系统 安全交换机 工控安全审计系统 工控入侵检测系统工程师站 A 操作员站 A 实时数据库A 操作员站…

Linux中的文件传输命令(scp、rsync)、Linux之间通过sshkey公钥免密登录

scp测试环境&#xff1a;centos7.7 最小化安装&#xff0c;默认是有scp命令 -r 递归复制整个目录 -p 保留源文件的修改时间、访问时间和权限 -v 详细方式显示输出 -P&#xff08;大写&#xff09;指定port&#xff08;端口&#xff09;输出scp命令使用格式 scp /filename 目…

Linux 程序开发 之 库打桩机制

目录前言一、库打桩定义二、编译时打桩三、链接时打桩四、运行时打桩五、处理目标文件的工具前言 Linux 链接器支持一个很强大的技术&#xff0c;称为库打桩(library interpositioning)&#xff0c;它允许你截获对共享库函数的调用&#xff0c;取而代之执行自己的代码。使用打桩…

m基于ACO蚁群优化的货车运输路线规划matlab仿真,考虑车辆载重,单位运输成本等因素

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 蚁群算法是通过对自然界中真实蚂蚁的集体行为的观察,模拟而得到一种仿生优化算法,它具有很好的并行性,分布性.根据蚂蚁群体不同的集体行为特征,蚁群算法可分为受蚂蚁觅食行为启发的模型和受孵化分…

渗透学习-靶场篇-WebGoat靶场(JWT攻击)

文章目录前言一、介绍JWTJWT令牌结构获取的令牌的基本过程二、攻击方式以及靶场的搭建1.安装cWebGoat2.空加密验证攻击3.字典爆破三、认证-键值逻辑前言 本次主要学习了javaweb项目方面任意出现的一些安全问题&#xff0c;最主要的是有关于JWT身份认证上的攻击&#xff0c;并利…

es的搜索服务

1、在项目中&#xff0c;创建一个搜索服务的模块&#xff1a;search-service 2、在新创建的搜索模块中添加依赖&#xff1a; <dependencies><!--nacos--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-start…

MyBatis-Plus中的逻辑删除使用

系列文章目录 Mybatis-PlusSpringBoot结合运用_心态还需努力呀的博客-CSDN博客MyBaits-Plus中TableField和TableId用法_心态还需努力呀的博客-CSDN博客 MyBatis-Plus分页查询&#xff08;快速上手运用&#xff09;_心态还需努力呀的博客-CSDN博客_mybatis plus分页查询 MyBa…

【ESXi 7.x 升 8.x】ESXi 升级 —— 使用 ESXCLI 升级 ESXi(Offline Bundle ZIP)

目录3.1 示例 — 使用 ESXCLI 升级 ESXi&#xff08;Offline Bundle ZIP&#xff09;【目标&#xff1a;将 ESXi 6.5 U2 GA 升级为 7.0 U3f】&#xff08;1&#xff09;下载离线升级ZIP包&#xff08;2&#xff09;升级 ESXi① 查看离线包② 升级前确认ESXi版本③ 获取升级用的…

[附源码]Python计算机毕业设计大学生社团管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

ChatGPT教程之 01 什么是ChatGPT革命性的对话生成新工具

今天,我想揭开 ChatGPT 的神秘面纱——GANs*(生成对抗网络)的一个迷人的新应用程序,它在 AI 社区中引起了很大的轰动。 对于那些不熟悉 GAN 的人来说,它们是一种神经网络,它使用两个相互竞争的网络——一个生成器和一个鉴别器——来创建逼真的输出。生成器创建假输出,而…

Paper Note——经典Polyline类型Map论文损失函数

文章目录1. Hierarchical Recurrent Attention Networks for Structured Online Maps2. DAGMapper: Learning to Map by Discovering Lane Topology1. Hierarchical Recurrent Attention Networks for Structured Online Maps https://patrick-llgc.github.io/Learning-Deep-Le…

QT(4)-QAbstractItemView

QAbstractItemView1 说明2 常用函数2.1 交替行颜色2.1.1 alternatingRowColors2.1.2 setAlternatingRowColors2.2 autoScroll2.2.1 hasAutoScroll2.2.2 setAutoScroll2.3 autoScrollMargin2.3.1 autoScrollMargin2.3.2 setAutoScrollMargin2.4 defaultDropAction2.4.1 setDefau…

python--飞机大战

实现功能&#xff1a; 1&#xff1a;飞机的移动&#xff0c;发射子弹&#xff0c;手雷&#xff0c;生命值&#xff0c;生命条 2&#xff1a;敌飞机有3种形态&#xff08;小&#xff0c;中&#xff0c;大&#xff09;不同的飞机大小不一样&#xff0c;生命值不一样&#xff0c…

基于springboot+mybatis+mysql+vue在线订餐系统

基于springbootmybatismysqlvue在线订餐系统一、系统介绍二、功能展示1.主页(用户)2.菜单(用户)3.用户注册(用户)4.用户登陆(用户)5.我的订单(用户)6.我的购物车(用户)7.首页(管理员)8.用户管理(管理员)9.商品管理(管理员)9.订单管理(管理员)10.评论管理(管理员)三、获取源码一…