前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >java架构之路-(面试篇)Mysql面试大全

java架构之路-(面试篇)Mysql面试大全

作者头像
小菜的不能再菜
修改于 2019-10-15 07:59:55
修改于 2019-10-15 07:59:55
6530
举报
文章被收录于专栏:java_pythonjava_python

说一下mysql比较宏观的面试,具体咋写sql的这里就不过多举例了。后面我还会给出一个关于mysql面试优化的试题,这里主要说的索引和B+Tree结构,很少提到我们的集群配置优化方案。

1.索引是什么?有什么作用以及缺点

答:索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。也可以理解为索引就是一本书的目录,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚集索引那么需要的空间就会更大。

2.索引的目的是什么

  答:为了高效的查找得到我们所需要的数据,减少分组和排序时间,提高我们的mysql的性能

3.索引对数据库系统的负面影响

  答:虽然索引对于数据库的查询提高了效率,但一定程度上增加了空间的占用,同时写入的速度降低了不少,和原有写入数据相比较,多了一步去维护索引的操作。

4.建立索引的原则

  答:选择唯一性索引,为经常需要查询、排序、分组和联合操作的字段建立索引,限制索引的数目,最左前缀匹配原则(非常重要的原则),尽量选择区分度高的列作为索引,字段尽力设置不为null,索引列上不计算。

5.主键、外键和唯一索引的区别

  答:定义:

      主键:唯一标识一条记录,不能有重复的,不允许为空

      外键:表的外键是另一表的主键, 外键可以有重复的, 可以是空值

      索引:该字段没有重复值,但可以有空值

    作用:

      主键:用来保证数据完整性

      外键:用来和其他表建立联系用的

      索引:是提高查询排序的速度

    个数:

      主键:主键只能有一个

      外键:一个表可以有多个外键

      索引:一个表可以有多个唯一索引

6.MySQL底层实现,MySQL有什么引擎

  答:mysql底层采用B+tree的存储结构,也就是只有叶子节点携带真实数据,每个节点大小为16Kb,大致三层的B+tree就可以存2000W左右的数据,大大的减少了磁盘的IO。我们常见的存储引擎有InnoDB和MyISAM。

7.InnoDB和MyISAM区别,InnoDB替代了MyISAM,那么MyISAM是否一无是处。

  答:InnoDB支持事务,支持行锁,在磁盘上只存两个文件,一个是索引文件,另一个是数据文件,在B+Tree的主键索引上,叶子节点携带全部数据,MyISAM不支持事务,不支持行锁,磁盘上存了三个文件,一个是索引文件,另一个是数据文件,还有一个存放的对应关系文件,从查询的角度来说,InnoDB没有MyISAM的单条查询速度高,MyISAM采用Hash存储回行得到数据的查询过程,单MyISAM对于范围查询不是很友好。因此我们可以看出InnoDB用的更广一些,但同时MyISAM对于非范围查询的高效还是有很大用处的,而且MyISAM对于表内的总数查询,维护了单独的数据,也是很高效的。

8.什么是事务,事务特性

  答:事务是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。在我们的mysql里也是如此,也就是我们的ACID原则。A原子性,把一系列的动作视为一个最小的操作(原子操作)C一致性,从一个状态到另一个状态是一致的,I隔离性:事务与事务之间是不可见相互隔离的,D持久性:一旦事务提交,则所做修改就会被永久保存到数据库中。可以简单说一下可重复读的MVCC机制,面试官也懵圈。

9.如何设计一个高并发的系统(对于mysql来讲)

  答:这个后面会结合别的技术来说,只讲mysql不太好说。大致就是我们首先应该考虑到的是读写分离操作(过几天博客里会详细说这个),再就是我们常见的分库分表操作,水平切分垂直切分。还可以加入缓存redis操作。合理使用索引,explain进行sql优化。

10.锁的优化策略

  答:优化,也就是最小力度的锁我们的数据,也就是行锁,InnoDB的行锁其实是加在索引字段的,避免行锁的升级为表锁,再就是我们尽量避免间隙锁,尽量避免我们的范围修改,如果真的必须范围修改,那么我应该尽可能的缩小到最小的范围。

11.优化SQL的方法

答:设置一个主键索引,需主要主键索引一般没有真正业务含义,使用int类型自动增长的,而且不能为null,非主键索引字段优先考虑区分度高的业务情况和最左前缀原则,设置为null。如果真的数据量不大,不建议加索引,反而会影响效率的。选取最适用的字段属性,尽可能减少定义字段宽度,尽量把字段设置NOTNULL,使用连接(JOIN)来代替子查询,适用联合(UNION)来代替手动创建的临时表。学会使用explain进行SQL分析,实在不行可以打开trace进行分析SQL情况,用完记得关闭。

12.谈谈三大范式,什么时候使用反范式设计

  答:第一范式(1NF):确保每列保持原子性即列不可分

    第二范式(2NF):属性完全依赖于主键,也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。

    第三范式(3NF):属性和主键不能间接相关(减少数据冗余,这样就可以通过主外键进行表之间连接)

  比如我们表比较多,需要关联时,但我们的A表只需要关联B表的一个字段,而且每次都需要关联查询你,这时我们可以采用A表放置一个冗余字段来存B表的那个字段。这个操作其实就是一个反范式的。

13.说几个mysql中你常用的函数答:

  答:sum、count 、avg、min、max

14.varchar(100)和varchar(200)的区别

  答:占用内存空间大小肯定是不一致的,但是占用我们磁盘的大小是一致的,我们存储字符串"abc",完全是一样的磁盘空间,但是对于varchar(100)来说,接收到的字符串长度太长了就会报错的。后面的数字代表可存储的字节数。

15.varchar(20)和int(20)中的20含义一样吗

  答:显然不一致,int(M) M表示的不是数据的最大长度,只是数据宽度,并不影响存储多少位长度的数据;varchar(M) M表示的是varchar类型数据在数据库中存储的最大长度,超过则不存;

16.如何开启慢日志查询?

  答:有2种方式,一是修改mysql的配置文件,二是通过set global语句来实现。slow_query_log = ON,打开日志,long_query_time = 2,设置时间,2秒就算是慢查询,然后重启mysql服务即可,进入mysql控制台,输入SET GLOBAL slow_query_log = 'ON';SET GLOBAL long_query_time = X;不需要重启服务就可以得到慢查询日志。

总结一下:

  只要我们熟知,我们mysql的底层是B+tree的,B+tree是什么样子的,很多面试题都是围绕这个东西来出题的,为什么不为空,空不好找B+tree的位置啊等等。再就是我们要学会使用Explain来分析sql,有的时候即使有覆盖索引,mysql也不一定去走的,他内部底层会判断走这个索引的代价。可以自行尝试。关于索引和结构的文章https://cloud.tencent.com/developer/article/1508408。然后就是我们的事务,也是很重要的一部分。总之不管他怎么问我们,我们真的理解了其中的原理,就算是题再怎么变化,也脱离不了底层原理的,我们要学会加法,而不是要学会1+1。

最进弄了一个公众号,小菜技术,欢迎大家的加入

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-10-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
java架构之路-(四)Mysql之让我们再深撸一次mysql
  让我再深撸一次mysql吧,这次主要以应对面试来说说mysql,大概几个方向,索引结构,查询引擎,索引优化,explain的详解和trace工具的使用。
小菜的不能再菜
2019/09/18
4700
java架构之路-(四)Mysql之让我们再深撸一次mysql
mysql数据库面试题目及答案_java面试数据库常见问题
其他面试题类型汇总: Java校招极大几率出的面试题(含答案)—-汇总 几率大的网络安全面试题(含答案) 几率大的多线程面试题(含答案) 几率大的源码底层原理,杂食面试题(含答案) 几率大的Redis面试题(含答案) 几率大的linux命令面试题(含答案) 几率大的杂乱+操作系统面试题(含答案) 几率大的SSM框架面试题(含答案) 几率大的数据库(MySQL)面试题(含答案) 几率大的JVM面试题(含答案) 几率大的现场手撕算法面试题(含答案) 临时抱佛脚必备系列(含答案) 注:知识还在积累中,不能保证每个回答都满足各种等级的高手们,若发现有问题的话,本人会尽快完善。 。◕‿◕。
全栈程序员站长
2022/09/27
9580
mysql数据库面试题目及答案_java面试数据库常见问题
Java 面试知识点解析(六)——数据库篇
在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大部分内容参照自这一篇文章,有一些自己补充的,也算是重新学习一下 Java 吧。
我没有三颗心脏
2018/05/21
1.3K2
Java 面试知识点解析(六)——数据库篇
Mysql高频面试题
Feelings are just visitors. Let them come and go.
小闫同学啊
2020/02/19
8920
根据面试经历,总结mysql面试题(实时更新)
1.客户端向服务器端发送SQL命令 2.服务器端连接模块连接并验证 3.缓存模块解析SQL为Hash并与缓存中Hash表对应。如果有结果直接返回结果,如果没有对应继续向下执行 4.解析器解析SQL为解析树,如果出现错误,报SQL解析错误。如果正确,向下传递 解析时主要检查SQL中关键字,检查关键字是否正确、SQL中关键字顺序是否正确、引号是否对应是否正确等。
一写代码就开心
2022/05/09
5880
根据面试经历,总结mysql面试题(实时更新)
mysql日常面试题总结
1. 如何设计一个高并发的系统 ① 数据库的优化,包括合理的事务隔离级别、SQL语句优化、索引的优化 ② 使用缓存,尽量减少数据库 IO ③ 分布式数据库、分布式缓存 ④ 服务器的负载均衡 2. 锁的优化策略 ① 读写分离 ② 分段加锁 ③ 减少锁持有的时间 ④ 多个线程尽量以相同的顺序去获取资源 等等,这些都不是绝对原则,都要根据情况,比如不能将锁的粒度过于细化,不然可能会出现线程的加锁和释放次数过多,反而效率不如一次加一把大锁。这部分跟面试官谈了很久 3. 索引的底层实现原理和优化 B+树,经过优化
友儿
2022/09/11
6650
mysql面试题总结[通俗易懂]
1)超键(super key) :在关系中能唯一标识元组的属性集称为关系模式的超键
全栈程序员站长
2022/09/27
1.2K0
mysql面试题总结[通俗易懂]
03-面试必会-Mysql篇
Select [distinct ] <字段名称> from 表 1 [ <join 类型> join 表 2 on <join 条件> ] where <where 条件> group by <字段>
捞月亮的小北
2023/12/01
2710
03-面试必会-Mysql篇
MySQL 三万字精华总结 + 面试100 问,吊打面试官绰绰有余(收藏系列)
和其它数据库相比,MySQL有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用。主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其它的系统任务以及数据的存储提取相分离。这种架构可以根据业务的需求和实际需要选择合适的存储引擎。
帅地
2020/06/03
2.8K1
MySQL 三万字精华总结 + 面试100 问,吊打面试官绰绰有余(收藏系列)
Java高频面试之Mysql篇
char:固定长度,不够会在末尾补空格,取出时删除所有末尾的空格,所以取出时会丢失末尾的空格,可能会浪费空间,查询效率比varchar高,单位字符,最多存255个字符,和字符集无关.
九转成圣
2024/04/10
1430
Java高频面试之Mysql篇
数据库面试题汇总
1、如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择主键作为聚集索引。
用户4283147
2022/10/27
5710
数据库面试题汇总
MySQL面试题 硬核47问
在这个例子中,9(precision)代表将被用于存储值的总的小数位数,而2(scale)代表将被用于存储小数点后的位数。
小熊学Java
2022/09/16
1.6K0
2024年java面试准备--mysql(1)
数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询,更新数据库中表的数据。索引的实现通常使用B树和变种的B+树(MySQL常用的索引就是B+树)。除了数据之外,数据库系统还维护为满足特定查找算法的数据结构,这些数据结构以某种方式引用数据,这种数据结构就是索引。简言之,索引就类似于书本,字典的目录。
终有救赎
2023/10/16
2230
2024年java面试准备--mysql(1)
数据库-面试
共享锁也称为读锁,相互不阻塞,多个客户在同一时刻可以同时读取同一个资源而不相互干扰。
知识浅谈
2022/02/25
1.1K0
2022 最新 MySQL 面试题
1、 表级锁: 开销小, 加锁快 ; 不会出现死锁 ; 锁定粒度大 , 发生锁冲突的概率最 高, 并发度最低。
猫头虎
2024/04/07
1710
2022 最新 MySQL 面试题
MySQL数据库常见面试题总结
(1)客户端与数据库进行通信前,通过数据库驱动与MySQL建立连接,建立完成之后,就发送SQL语句
全栈程序员站长
2022/06/29
4230
MySQL数据库常见面试题总结
面试:mysql最全索引与优化详解
mysql 是我们最常用的数据存储的的程序,它是关系数据库的代表,可以直接服务于我们的常规业务,是我们不能离开的数据存储器,对于关系操作复杂的业务,具有很强的优势。
Tim在路上
2020/08/04
7630
MySQL 面试题
这些范式的设计目的是为了减少数据冗余、提高数据完整性,并简化数据结构,从而使数据库更加稳定和高效。遵守这些范式可以让数据库设计得到结构化,但也应当注意,在某些情况下,为了提高查询效率,开发者会有意识地违反这些范式来进行数据库的反规范化设计。
Lemon黄
2023/12/13
2190
MySQL 面试题
mysql数据库面试题目及答案_数据库面试常问问题
大家好,又见面了,我是你们的朋友全栈君。 MySQL数据库面试题(2022最新版) 🐶 程序猿周周 ⌨️ 短视频小厂BUG攻城狮 🤺 如果文章对你有帮助,记得关注、点赞、收藏,一键三连哦,你的支持将成为我最大的动力 ---- 本文是 Java 面试总结系列的第1️⃣篇文章,该专栏将整理和梳理笔者作为 Java 后端程序猿在日常工作以及面试中遇到的实际问题,通过这些问题的系统学习,也帮助笔者顺利拿到阿里、字节、华为、快手等Offer,也祝愿大家能够早日斩获自己心仪的Offer。由于笔者能
全栈程序员站长
2022/09/23
4280
mysql数据库面试题目及答案_数据库面试常问问题
程序员面试备战篇:18个经典MySQL面试专题解析(干货分享答案)
欢迎关注专栏:Java架构技术进阶。里面有大量batj面试题集锦,还有各种技术分享,如有好文章也欢迎投稿哦。 微信公众号:慕容千语的架构笔记。欢迎关注一起进步。
欧阳愠斐
2019/08/21
1.7K0
程序员面试备战篇:18个经典MySQL面试专题解析(干货分享答案)
相关推荐
java架构之路-(四)Mysql之让我们再深撸一次mysql
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档