MySQL常见面试题与答案

存储引擎

InnoDB的主要特点是什么?

  • MySQL5.5版本之后的默认存储引擎;
  • 支持事务;
  • 支持行级锁;
  • 支持MVCC;
  • 支持聚集索引方式存储数据。

InnoDB与MyISAM的区别?

存储引擎MyISAMInnoDB
存储结构MyISAM在磁盘上存储成三个文件,其中.frm文件存储表定义,.MYD 为数据文件,.MYI 为索引文件。InnoDB是由.frm文件、表空间(分为独立表空间或者共享表空间)和日志文件(redo log)组成。
存储空间可被压缩,存储空间较小。需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。
事务支持强调的是性能,执行速度比InnoDB快,但不支持事务。支持事务,具有ACID的特性
只支持表级锁。 如果执行大量的select,MyISAM是更好的选择。但是在增删改的时候需要锁定整个表格,效率会低一些。支持事务和行级锁,是InnoDB的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁只有在WHERE条件命中索引时才是有效的,如果全表扫描会锁定整张表。
索引MyISAM的索引都属于B+Tree结构的非聚簇索引,索引与数据是分开的,B+Tree的叶子节点上存放的是数据的地址。主键索引和辅助索引没有区别,只是主键索引必须是唯一的。InnoDB的主键是B+Tree结构的聚簇索引,将主键组织到一棵B+Tree中,而行数据就储存在叶子节点上。聚簇索引是按大小排列的,因此对于范围查询的效率很高。InnoDB中除了主键索引其他辅助索引都是非聚簇索引,叶子节点则存储的是主键的值,所以通过辅助索引查询其实需要两个过程,先确定数据的主键,再通过主键进行查询。
select count(*)MyISAM保存了表的总行数,如果select count(*) from table不加where条件,会直接取出出该值。InnoDB没有保存表的总行数,如果使用select count(*) from table就会遍历整张表。如果加了where条件后,MyISAM和InnoDB处理的方式都一样。
全文索引支持 FULLTEXT类型的全文索引不支持FULLTEXT类型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。
外键不支持支持

查询

MySQL执行一次SQL需要经过哪些流程?

img

注:MySQL8.0已取消查询缓存

为什么MySQL 8.0默认关闭了缓存开启?

  1. 在查询之前必须先检查是否命中缓存,浪费计算资源;
  2. 如果这个查询可以被缓存,那么执行完成后,MySQL发现查询缓存中没有这个查询,则会将结果存入查询缓存,这会带来额外的系统消耗;
  3. 针对表进行写入或更新数据时,将对应表的所有缓存都设置失效;
  4. 如果查询缓存很大或者碎片很多时,这个操作可能带来很大的系统消耗;
  5. 缓存应该由Redis、MC等中间件去完成(专人干专事)。

EXPLAIN如何使用?

MySQL EXPLAIN属性分析_学无止境-CSDN博客

索引

MySQL索引默认用哪种数据结构?优点是什么?

B+Tree;

优势:

  • 磁盘读写能力强。B+Tree非叶节点不保存数据相关信息,只保存关键字和子节点的引用,所以一个节点可以保存更多关键字,一次磁盘加载的关键字更多。
  • 扫表能力更强。B+Tree关键字对应的数据都保存在叶子节点上, 进行全表扫描时,只需要遍历叶子节点,无需遍历整棵树。
  • 遍历、排序、范围搜索的能力更强。B+Tree叶子节点是顺序排列的,并且相邻节点具有顺序引用的关系,所以对于这种依赖顺序或范围的操作更有优势。
  • 检索效率更加稳定。B+Tree 永远是在叶子节点拿到数据,所以 IO 次数是稳定的。

索引为什么不用平衡二叉树?

  • 太高:树的高(深)度决定着它的IO操作次数。显然,当数据量逐渐增加时,平衡二叉树的深度也会显著增加。
  • 太小:每一个节点保存的数据量太小了。没有很好的利用操作磁盘IO的数据交换特性,也没有利用好磁盘IO的预读能力(空间局部性原理),从而带来频繁的IO操作。

如果用Hash索引会有什么问题?

  • 不适合范围查找、排序等操作

聚簇索引和非聚簇索引的区别?

  • InnoDB的主键是B+Tree结构的聚簇索引,将主键组织到一棵B+Tree中,而行数据就储存在叶子节点上。聚簇索引是按大小排列的,因此对于范围查询的效率很高。
  • InnoDB中除了主键索引其他辅助索引都是非聚簇索引,叶子节点则存储的是主键的值,所以通过辅助索引查询其实需要两个过程,先确定数据的主键,再通过主键进行查询。

什么是最左前缀原则?

  • 对索引中关键字进行匹配时,一定是从左往右依次进行,不能跳过。如果最左边是模糊的,那么将无法命中索引。
  • 例如对于单列索引:a like’%123’;联合索引 (a,b,c):where b=2 and c=3; 都无法命中索引。
  • 理解了索引结构 B+Tree 的特点之后,就不难理解最左前缀原则了。

什么是覆盖索引?

  • 如果一本书需要知道第 11 章是什么标题,会翻开第 11 章对应的那一页吗?目录浏览一下就好,这个目录就是起到覆盖索引的作用;
  • 即通过索引便可以直接得到想要的内容,这个过程称为覆盖索引。

为什么MySQL选择B+Tree索引而MongoDB却选择了B-Tree索引?

  • B+Tree将行数据保存在叶子节点,而B-Tree的每个节点都保存数据,因此B+Tree的查询时间复杂度固定是logn,而B-Tree查询复杂度最好是 O(1);
  • B+Tree更适合范围查找,B-Tree单次查找的平均效率更高;

事务

ACID分别指什么?

  • 原子性(Atomicity):整个事务所有操作要么全部提交成功,要么全部失败回滚,不可能只成功一部分。
  • 一致性(Consistency):事务中操作的数据及状态改变是一致的,即写入资料的结果必须完全符合预设的规则,不会因为出现系统意外等原因导致状态的不一致。
  • 隔离性(Isolation):通常来说,一个事务所做的修改在最终提交以前,对其它事务是不可见的。多个事务之间的操作相互不影响。
  • 持久性(Durability):事务提交后,事务对数据库的所有更新将被保存到数据库,且无法撤回。一旦一个事务已经提交了,就算服务器崩溃,仍然需要在下次启动的时候结合事务日志自动恢复。

事务并发下会有哪些问题?

  • 脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据。
  • 不可重复读:事务A多次读取同一条数据,事务B在事务A执行的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。
  • 幻读:事务A对多次读取某一范围的数据,事务B在事务A执行的过程中插入并提交一条满足A读取范围的数据,使A发现数据变多了,犹如产生幻觉一般。

事务的隔离级别有哪些?MySQL默认是哪种?

隔离级别说明脏读不可重复读幻读
读未提交(read-uncommitted)性能没有明显优势,同时缺乏其他级别的好处,因此很少使用。
读已提交(read-committed)大多数数据库的默认级别,只能看到已提交的事务,避免了脏读,但相同查询可能读到不同结果。
可重复读(repeatable-read)MySQL默认级别,非InnoDB可能产生幻读。InnoDB 否
串行化(serializable)在读取的每行数据上都加锁,强制事务串行执行,会导致大量超时与锁竞争问题,一般很少使用。

写操作是否会阻塞读操作,为什么?

  • 不会,InnoDB引擎可以通过MVCC(多版本并发控制)实现并发访问下,对事务内正在处理的数据做多版本管理。以实现写操作堵塞的同时,依然可以进行读操作。
  • MVCC是基于undo log实现的,事务未提交之前,Undo log保存了未提交之前的版本数据,Undo log中的数据可作为数据旧版本快照供其他并发事务进行快照读。

事务回滚的原理是什么?

  • 在事务提交前,Undo log保存了未提交之前的版本数据,事务处理过程中如果出现了错误或者用户执行了 ROLLBACK语句,MySQL可以利用Undo Log中的备份将数据恢复到事务开始之前的状态。

如何保证的持久性?

  • 持久性是通过redo log实现,MySQL会将事务中操作的最新数据备份到redo log;
  • redo log可以让数据在事务提交时以顺序IO的方式快速持久化到文件,然后再异步的将这部分数据刷到具体的磁盘位置,这样即使刷盘前发生宕机,系统重启后也可以通过redo log来恢复数据。

InnoDB中锁有哪些种类?

  • 表锁 & 行锁;
  • 共享锁 & 排它锁;
  • 意向共享锁 & 意向排它锁:意向锁为表级别的锁,当事务想去进行锁表时,可以先判断意向锁是否存在,存在时则可快速返回该表不能启用表锁;
  • 自增锁:针对自增列自增长的一个特殊的表级别锁;
  • 记录锁:记录锁锁住的是具体的索引项;
  • 临键锁:临键锁锁住的是记录+区间(左开右闭】,临键锁(左开右闭】可以利用B+Tree从左至右连续的特性来避免幻读;
  • 间隙锁:间隙锁锁住的是数据不存在的区间(左开右开)。

什么情况下会发生死锁?

  • 多个并发事务(2个或者以上);
  • 每个事务都持有锁(或者是已经在等待锁);
  • 每个事务都需要再继续持有锁;
  • 事务之间产生加锁的循环等待,形成死锁。

如何避免死锁?

  • 类似的业务逻辑以固定的顺序访问表和行;
  • 大事务更倾向于死锁,如果业务允许,将大事务拆成小事务;
  • 在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁概率;
  • 涉及加锁的操作条件要索引。如果不走索引将会为表的每一行记录添加上锁(或者说是表锁)。

分库分表

常见的分片策略有哪些?

  • 基于时间分片:按年、月、日等,适合存储账单、流水等,容易扩展,缺点是冷热不均);
  • 基于范围分片:110000、1000020000等;
  • 基于地域分片:北京、上海等;
  • Hash取模分片:存储与负载更均匀,缺点是不易扩展。

订单表如何选择分片键(买家id、商家id)?

  • 可以考虑买家订单存一份、商家订单存一份,分别按不同字段分片(空间换时间);
  • 如果重复字段多,可以考虑增加关系映射表,如订单表按照买家id分片,买家、商家关系表按照商家id分片。

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

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

相关文章

Spring 异常处理三种方式

Spring 异常处理三种方式 异常处理方式一. ExceptionHandler异常处理方式二. 实现HandlerExceptionResolver接口异常处理方式三. ControllerAdviceExceptionHandler三种方式比较说明(强烈推荐各位看一下,我觉得自己总结的比较多,嘿嘿,不对之…

Netty常见面试题 与 答案

Netty基础知识 什么是Netty? Netty 是一款用于高效开发网络应用的 NIO 网络框架,它大大简化了网络应用的开发过程; 封装了JDK底层的NIO模型,提供高度可用的API,用于快速开发高性能服务端和客户端;精心设计…

CAS单点登录详细流程

一、CAS简介和整体流程 CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS 具有以下特点: 【1】开源的企业级单点登录解决方案。 【2】CAS Server 为…

android 图片自动拉伸,解决关于ImageView自适应的问题(拉伸变形,图片模糊)

今天接手一个项目发现有个地方的图片显示非常小,而且还不够清晰,也没办法自适应屏幕的显示,非常的影响美观,于是 就像这优化一下。先看看优化前的效果和优化后的效果。修复后修复前布局文件修复前:修复前布局文件修复后…

redisTemplate.opsForValue()中方法讲解

查看源码可以看到redisTemplate.opsForValue()中的方法都定义在ValueOperations<K, V> 中&#xff0c;该接口中一共有17个方法&#xff1a; public interface ValueOperations<K, V> {void set(K key, V value);void set(K key, V value, long timeout, TimeUnit …

spring boot配置dubbo(properties)

spring boot与dubbo配置(properties) dubbo和zookeeper配合使用&#xff0c;具体的它们之间的配置这里不说了。 一、spring boot与dubbo配置有两种方式&#xff1a; 1&#xff09;spring boot在自己的配置文件application.properties 配置dubbo。&#xff08;本篇主要说这个&…

spring boot配置dubbo(XML)

上一篇写的是spring boot在自己的properties配置文件中简单配置dubbo的步骤&#xff0c;那种配置有很多的功能&#xff08;比如超时时间、是否检查&#xff09;等等&#xff0c;配置起来也挺麻烦的&#xff0c;而我们也习惯传统的那种XML形式的dubbo配置。 这一篇写的是spring…

spring boot配置dubbo注意事项

spring boot配置dubbo注意事项 通过前两篇文章&#xff0c;知道了spring boot配置dubbo有两种方式。具体请回顾前两篇文章吧。 现在主要是说下spring boot在自己的application.properties 文件里配置dubbo内容&#xff0c;这种方式遇到的问题。 问题一&#xff1a;dubbo接口…

spring boot配置mybatis和事务管理

spring boot配置mybatis和事务管理 一、spring boot与mybatis的配置 1.首先,spring boot 配置mybatis需要的全部依赖如下&#xff1a; <!-- Spring Boot 启动父依赖 --> <parent><groupId>org.springframework.boot</groupId><artifactId>spr…

android hud sdk,Android HUD SDK | 百度地图API SDK

简介为了给用户提供更安全优质的服务&#xff0c;LBS开放平台针对Android平台的SDK产品引入Key认证机制&#xff0c;用户在使用之前需要先申请配置Key&#xff0c;并在程序相应位置填写您的Key。Key机制&#xff1a;每个Key仅且唯一对于1个应用验证有效&#xff0c;即对该Key配…

spring boot配置druid(德鲁伊)

spring boot配置druid(德鲁伊) 关于druid的介绍请看 阿里巴巴温少访谈 1.引入相关依赖&#xff0c;全部依赖是上一篇spring bootmybatis依赖的基础上&#xff0c;再加上下边的依赖&#xff0c;如下&#xff1a; <!-- Druid数据库连接池组件 --> <dependency><…

spring boot----简单入门

Spring Boot其实就是spring,为了简便spring框架的搭建&#xff0c;快速开发项目而推出的另一种方式。使用spring boot&#xff0c;搭建框架将变得特别快。可以有更多的时间在代码性能上优化了。 一、Spring Boot个人感觉的优点: ​ 1&#xff09;搭建一个简单运行的框架很快&…

android js 代码混淆工具,好用的JS(Javascript)混淆加密工具-HDS JSObfuscator 2.14版

好用的JS(Javascript)混淆加密工具-HDS JSObfuscator 2.14版书法字体2017.06.23css压缩分享一款好用的JS混淆加密工具:HDS JSObfuscator 2.14版&#xff0c;HDS JSObfuscator兼顾了JS压缩、JS混淆和JS加密三大功能。js加密工具的主要作用就是为了保护Javascript代码&#xff0c…

Maven 建立父子项目和跨项目调用内容的步骤

使用Maven管理项目&#xff0c;同时我们是做微服务&#xff0c;所以对于微服务项目来说&#xff0c;使用Maven建立起一个父子项目这种关系&#xff0c;很方便管理&#xff08;只是个人感觉&#xff09; 设计层面 &#xff08;1&#xff09;服务端和客户端肯定是分开写的&…

android支付宝运动修改器,一键修改支付宝运动步数-修改支付宝运动步数工具下载不要root手机版-西西软件下载...

修改支付宝运动步数工具是一款支付宝运动步数修改工具和教程,QQ微信也可以修改&#xff0c;最近在支付宝中推出了各种运动活动&#xff0c;很多朋友表示想要直接刷步数&#xff0c;不想去亲自运动来增加步数。那么下面手机乐园水银师小编就为大家介绍了支付宝快速刷步数的方法&…

spring boot配置tomcat部署

spring boot本身默认为jar包运行&#xff0c;可以改为war包&#xff0c;然后运行在tomcat里 具体修改的步骤如下&#xff1a; 1.在pom.xml文件里添加需要的依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>s…

android同步aar到jcenter,android上传aar到jcenter

一、jcenter配置1、jcenter官网注册账号官网地址&#xff1a;https://bintray.com注册页面&#xff1a;2、注册成功记录API Key 鼠标放在账户名上&#xff0c;点击Edit Profile,选择API Key,在这里是需要输入登录密码的&#xff0c;然后就可以看到你的key3、创建仓库点击此处进…

spring boot配置logback日志

spring boot配置logback日志 在上一篇spring boot入门里提过&#xff0c;Spring Boot默认的日志打印是logback,所以配置logback日志会很简单&#xff0c;但是也有注意的地方。 本次配置日志的需求 日志需要控制台打印和文件打印两种。其中文件打印按照日志级别分别保存到各自…

springboot-项目获取resources下文件的方法

spring项目获取resources下文件的方法 最近写读取模板文件做一些后续的处理&#xff0c;将文件放在了项目的resources 下&#xff0c;发现了一个好用的读取方法&#xff1a; 比如上边是你需要读取的文件&#xff1a; 读取的方法如下&#xff1a; //File file ResourceUtils…

几款经典好用的Android,经典实用 Android十款生活必备软件推荐

【IT168 应用】在众多Android应用中有许多优秀的生活方式软件&#xff0c;它们为我们的生活提供了各方面的服务&#xff0c;例如像查看天气预报、搜索周边美食、提醒重要事件等等。大家已经慢慢的熟悉了移动互联生活&#xff0c;尤其是工作中的白领&#xff0c;手机更成为了他们…