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

MySQL高级面试题整理

1. 执行流程

  1. mysql客户端先与服务器建立连接
  2. Sql语句通过解析器形成解析树
  3. 再通过预处理器形成新解析树,检查解析树是否合法
  4. 通过查询优化器将其转换成执行计划,优化器找到最适合的执行计划
  5. 执行器执行sql

2. MYISAM和InNoDB的区别

  1. MYISAM:不支持外键、不支持事务、表锁
  2. InNoDB:支持外键、支持事务、行锁

3. 什么是索引

  1. 索引是数据结构
  2. 索引的目的是提高查询效率

4. 索引的优劣势

  1. 优势:提高数据检索的效率、降低数据排序和分组的成本
  2. 劣势:降低更新表的速度、占用空间

5. 聚簇索引与非聚簇索引

  1. 聚簇索引:叶子结点存储的是行数据
  2. 非聚簇索引:叶子结点存储的是物理地址值,访问数据总是需要二次查找(回表)

6. MySQL索引分类

  1. 按功能逻辑分:主键索引、唯一索引、全文索引、普通索引
  2. 按物理实现方式分:聚簇索引、非聚簇索引
  3. 按作用字段分:单列索引、联合索引

  1. 主键索引:设定为主键后数据库会自动建立索引
  2. 单值索引:一个索引只包含单个列
  3. 唯一索引:索引列的值唯一,可以为空
  4. 复合索引:一个索引包含多个列

7. 不同的存储引擎支持的索引类型

  1. InNoDB:支持B-tree、Full-text,不支持Hash索引
  2. MyISAM:支持B-tree、Full-text,不支持Hash索引
  3. Archive:不支持B-tree、Full-text,Hash索引
  4. NDB:支持Hash索引,不支持B-tree、Full-text
  5. Memory:支持B-tree、Hash索引,不支持Full-text索引

8. 创建索引

  1. 隐式创建:有主键约束、唯一性约束、外键约束的字段会自动创建索引
  2. 显示创建:create Table table_name Index index_name

9. 查看索引

  1. 方式一:show create table 表名;
  2. 方式二:show index from 表名;

10. 适合创建索引的11种情况

  1. 字段的数值有唯一性的限制
  2. 频繁作为where查询条件的字段
  3. 经常使用group by和order by 的列
  4. update、delete的where条件列
  5. distinct字段需要创建索引
  6. 多表联查时,创建索引的注意事项:第一,连接表的数量尽量不要超过三张;第二,对where条件创建索引;第三,对连接的字段创建索引
  7. 使用列的类型小的创建索引
  8. 使用字符串前缀创建索引
  9. 使用区分度高的创建索引
  10. 联合索引中使用最频繁的列放到联合索引的左侧
  11. 在多个字段都需要创建索引的情况下,联合索引优于单值索引

11. 限制索引的数目:单表的索引尽量不要超过6个

  1. 索引需要占用磁盘空间,需要维护
  2. 索引会影响insert,update,delete等语句的性能‘
  3. 优化器在选择执行计划时,如果有多个索引可以用,会增加优化器生成执行计划,降低查询效率

12. 不适合创建索引的情况

  1. 在where中使用不到的字段不建议建立索引
  2. 数据量小的表不建议建立索引
  3. 字段有大量重复的数据(重复率达到百分之10)不建议建立索引
  4. 经常更新的表不建议建立索引
  5. 无序的字段不建议建立索引(例如身份证)
  6. 不经常使用的索引建议删除
  7. 不要定义冗余或者重复的索引

13. explain的四种格式

  1. 传统格式:输出是表格形式
  2. JSON格式:输出信息最详细的格式,包含了执行的成本信息
  3. TREE格式:描述各个部分之间的关系和各个部分的执行顺序
  4. 可视化输出:

14. explain各字段含义

  1. select_type:区别普通查询、联合查询、子查询
  2. table:查询的表名
  3. type:all--->index--->range--->ref--->eq_ref--->const
  4. key:当前查询实际使用的索引
  5. key_len:索引中使用到的字节数,可以算出具体使用了索引中的哪些列
  6. ref:显示索引的那一列被使用
  7. rows:执行查询时必须检查的行数
  8. extra:不适合在其他列中显示但十分重要的额外信息

15. extra:

  1. Using filesort:使用了非索引字段排序
  2. Using temporary:临时表、根据非索引字段进行分组
  3. Using index:使用索引字段进行了查询
  4. Using where:使用where进行了过滤
  5. Using join buffer:使用了缓存,非主键缓存
  6. impossible where:where子句的值总是false

16. 索引失效的10种情况

  1. 在使用联合索引不满足最左匹配原则
  2. 使用了select *
  3. 索引列上有计算
  4. 索引列上用了函数
  5. 字段类型不同
  6. like查询条件中左边包含%
  7. 列对比
  8. 使用or关键字:or关键字连接的字段都要建立了索引则不会失效,否则索引失效
  9. not in,not exists使用在非主键字段会导致索引失效
  10. order by后没有where和limit条件,满足最左匹配原则但是多个字段的排序规则不同

17. 索引优化

  1. 物理查询优化:通过索引和表连接方式优化
  2. 逻辑查询优化:通过SQL等价变换提升查询效率

18. 范式的种类

  1. 第一范式(1NF):数据表中每个字段必须满足原子性
  2. 第二范式(2NF):满足第一范式、必须有主键、非主键字段必须完全依赖主键;
  3. 第三范式(3NF):满足第二范式、非主键字段只和主键字段直接关联(即非主键字段不能依赖于其他非主键字段)
  4. 巴斯-科德范式(BCNF):满足第三范式、并且只有一个候选键
  5. 第四范式(4NF):
  6. 第五范式(5NF,又称完美范式):

19. 如何定位调优问题

  1. 用户的反馈
  2. 日志分析
  3. 服务器资源使用监控
  4. 数据库内部状态监控

20. 优化MySQL的参数

  1. innodb_buffer_pool_size:innoDB类型的表和索引的最大缓存
  2. Key_buffer_size:索引缓冲区的大小
  3. table_cache:同时打开表的个数
  4. quert_cache_size:查询缓冲区的大小

21. 事务的原子性、一致性和持久性由事务的redo和undo日志保证

  1. redo日志:重做日志,提供再写入操作
  2. undo日志:回滚日志,回滚到某个记录版本

相关文章:

MySQL高级面试题整理

1. 执行流程 mysql客户端先与服务器建立连接Sql语句通过解析器形成解析树再通过预处理器形成新解析树,检查解析树是否合法通过查询优化器将其转换成执行计划,优化器找到最适合的执行计划执行器执行sql 2. MYISAM和InNoDB的区别 MYISAM:不支…...

【Java】面向对象三大基本特征

【Java】面向对象三大基本特征 1.封装 On Java 8:研发程序员开发一个工具类,该工具类仅向应用程序员公开必要的内容,并隐藏内部实现的细节。这样可以有效地避免该工具类被错误的使用和更改,从而减少程序出错的可能。彼此职责划分清晰&#x…...

蓝桥杯C++组怒刷50道真题(填空题)

🌼深夜伤感网抑云 - 南辰Music/御小兮 - 单曲 - 网易云音乐 🌼多年后再见你 - 乔洋/周林枫 - 单曲 - 网易云音乐 18~22年真题,50题才停更,课业繁忙,有空就更,2023/3/18/23:01写下 目录 👊填…...

Shell自动化管理 for ORACLE DBA

1.自动收集每天早上9点到晚上8点之间的AWR报告。 auto_awr.sh #!/bin/bash# Set variables ORACLE_HOME/u01/app/oracle/product/12.1.0/dbhome_1 ORACLE_SIDorcl AWR_DIR/home/oracle/AWR# Set date format for file naming DATE$(date %Y%m%d%H%M%S)# Check current time - …...

Unity学习日记13(画布相关)

目录 创建画布 对画布的目标图片进行射线检测 拉锚点 UI文本框使用 按钮 按钮导航 按钮触发事件 输入框 实现单选框 下拉菜单 多选框选项加图片 创建画布 渲染模式 第一个,保持画布在最前方,画布内的内容显示优先级最高。 第二个,…...

初阶C语言:冒泡排序

冒泡排序是一种简单的排序算法,它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。1.冒泡排序关于冒泡排序我们在讲…...

带头双向循环链表

在前面我们学习了单链表,发现单链表还是有一些不够方便,比如我们要尾插,需要遍历一遍然后找到它的尾,这样时间复炸度就为O(N),现在我们引入双向带头链表就很方便了,我们先看看它的结构。通过观察,我们发现一…...

C#中的DataGridView中添加按钮并操作数据

背景:最近在项目中有需求需要在DataGridView中添加“删除”、“修改”按钮,用来对数据的操作以及显示。 在DataGridView中显示需要的按钮 首先在DataGridView中添加需要的列,此列是用来存放按钮的。 然后在代码中“画”按钮。 if (e.Column…...

WEB安全 PHP基础

WEB安全 PHP基础 PHP简述 PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器")是一种通用开源脚本语言。 在一个php文件中可以包括以下内容:  PHP 文件可包含文本、HTML、…...

基础篇:07-Nacos注册中心

1.Nacos安装部署 1.1 下载安装 nacos官网提供了安装部署教程,其下载链接指向github官网,选择合适版本即可。如访问受阻可直接使用以下最新稳定版压缩包:📎nacos-server-2.1.0.zip,后续我们也可能会更改为其他版本做更…...

端口镜像讲解

目录 端口类型 镜像方向 观察端口位置 端口镜像实现方式 流镜像 Vlan镜像 MAC镜像 配置端口镜像 配置本地观察端口 配置远程流镜像(基于流镜像) 端口镜像是指将经过指定端口的报文复制一份到另一个指定端口,便于业务监控和故障定位…...

图形视图框架QGraphicsScene(场景,概念)

QGraphicsScene 该类充当 QGraphicsItems 的容器。它与 QGraphicsView 一起使用,用于在 2D 表面上可视化图形项目,例如线条、矩形、文本甚至自定义项目。 QGraphicsScene具有的功能: 提供用管理大量数据项的高速接口传播事件到每一个图形项…...

ChatGPT 拓展资料: 强化学习-SARSA算法

强化学习是一种机器学习技术,它关注的是在特定环境中,如何最大化一个智能体(agent)的累积奖励(reward)。强化学习算法会根据当前状态和环境的反馈来选择下一个动作,不断地进行试错,从而优化智能体的行为。 SARSA是一种基于强化学习的算法,它可以用于解决马尔可夫决策…...

SpringJDBC异常抽象

前言spring会将所有的常见数据库的操作异常抽象转换成他自己的异常,这些异常的基类是DataAccessException。DataAccessException是RuntimeException的子类(运行时异常),是一个无须检测的异常,不要求代码去处理这类异常SQLErrorCodeSQLExcepti…...

我在字节的这两年

前言 作为脉脉和前端技术社区的活跃分子,我比较幸运的有了诸多面试机会并最终一路升级打怪如愿来到了这里。正式入职时间为2021年1月4日,也就是元旦后的第一个工作日。对于这一天,我印象深刻。踩着2020年的尾巴接到offer,属实是过了一个快乐…...

Button(按钮)与ImageButton(图像按钮)

今天给大家介绍的Android基本控件中的两个按钮控件,Button普通按钮和ImageButton图像按钮; 其实ImageButton和Button的用法基本类似,至于与图片相关的则和后面ImageView相同,所以本节只对Button进行讲解,另外Button是TextView的子类,所以TextView上很多属性也可以应用到B…...

Chrome插件开发-右键菜单开启页面编辑

开发一个执行js脚本改变页面DOM的Chrome插件,manifest_version版本为3。 Chrome插件基本知识 Chrome插件通常由以下几部分组成: manifest.json 该文件为必须项,其它文件都是可选的。该文件相当于插件的meta信息,包含manifest版…...

指针进阶(上)

内容小复习🐱: 字符指针:存放字符的数组 char arr1[10]; 整型数组:存放整型的数组 int arr2[5]; 指针数组:存放的是指针的数组 存放字符指针的数组(字符指针数组) char* arr3[5]; 存放整型指针的数组(整型指针数组) int* arr[6]; 下面进入学习了哦~&…...

Python每日一练(20230318)

目录 1. 排序链表 ★★ 2. 最长连续序列 ★★ 3. 扰乱字符串 ★★★ 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 排序链表 给你链表的头结点 head ,请将其按 升序 …...

多层多输入的CNN-LSTM时间序列回归预测(卷积神经网络-长短期记忆网络)——附代码

目录 摘要: 卷积神经网络(CNN)的介绍: 长短期记忆网络(LSTM)的介绍: CNN-LSTM: Matlab代码运行结果: 本文Matlab代码数据分享: 摘要: 本文使用CNN-LSTM混合神经网…...

mybatis中获取参数的两种方式:${}和#{}

目录 1.#{} 2.${} 3.总结 1.#{} 本质是占位符赋值 示例及执行结果: 结论:通过执行结果可以看到,首先对sql进行了预编译处理,然后再传入参数,有效的避免了sql注入的问题,并且传参方式也比较简单&#xf…...

复制带随机指针的复杂链表

目录一、题目题目链接二、题目分析三、解题思路四、解题步骤4.1 复制结点并链接到对应原节点的后面4.2 处理复制的结点的随机指针random4.3 分离复制的链表结点和原链表结点并重新链接成为链表五、参考代码六、总结一、题目题目链接 ​​​​ ​ 题目链接:https://…...

【基于协同过滤算法的推荐系统项目实战-2】了解协同过滤推荐系统

本文目录1、推荐系统的关键元素1.1 数据1.2 算法1.3 业务领域1.4 展示信息2、推荐算法的主要分类2.1 基于关联规则的推荐算法基于Apriori的算法基于FP-Growth的算法2.2 基于内容的推荐算法2.3 基于协同过滤的推荐算法3、推荐系统常见的问题1、冷启动2、数据稀疏3、不断变化的用…...

线程安全(重点)

文章目录一.线程安全的概念1.1 线程安全的概念1.2 线程不安全的原因1.3 解决线程不安全二.synchronized-monitor lock(监视器锁)2.1 synchronized的特性(1)互斥(2)刷新内存(3)可重入2.2 synchronied使用方法1.直接修饰普通方法:2.修饰静态方法:3.修饰代码块:三.死锁3.1死锁的情…...

软件测试面试找工作你必须知道的面试技巧(帮助超过100人成功通过面试)

目录 问题一:“请你自我介绍一下” 问题二:“谈谈你的家庭情况” 问题三:“你有什么业余爱好?” 问题四:“你最崇拜谁?” 问题五:“你的座右铭是什么?” 问题六:“谈谈你的缺点” 问题七&#xff…...

Python快速入门:类、文件操作、正则表达式

类、文件操作、正则表达式1. 类2. 文件操作3. 正则表达式1. 类 类是用来描述具有相同的属性和方法的集合,定义了该集合中每个对象共有的属性和方法,对象是类的实例,可以调用类的方法。 定义类时,如有父类,则写在类名…...

java-day01

程序就是有序指令的集合 cmd执行java程序,javac Test.java,java Test java技术平台: javaSE标准版,javaEE企业版,javaME小型版 java语言面向对象的(oop),java跨平台性的(…...

玩转 Node.js 集群

一、介绍 Node 在 v0.8 时直接引入了 cluster 模块,用以解决多核 CPU 的利用率问题,同时也提供了较完善的 API,用以处理进程的健壮性问题。 cluster 模块调用 fork 方法来创建子进程,该方法与 child_process 中的 fork 是同一个…...

Day909.MySQL 不同的自增 id 达到上限以后的行为 -MySQL实战

MySQL 不同的自增 id 达到上限以后的行为 Hi,我是阿昌,今天学习记录的是关于MySQL 不同的自增 id 达到上限以后的行为的内容。 MySQL 里有很多自增的 id,每个自增 id 都是定义了初始值,然后不停地往上加步长。 虽然自然数是没有…...

JVM学习.01 内存模型

1、前言对于C、C程序员来说,在内存管理领域,他们拥有对象的“所有权”。从对象建立到内存分配,不仅需要照顾到对象的生,还得照顾到对象的消亡。背负着每个对象生命开始到结束的维护和管理责任。对于JAVA程序来说,因为J…...