面试不知道如何回答这六大知识点,你还敢说熟悉MySQL?
文章目录
一、事务
什么是事务
事务的四大特性
事务的并发问题
① 事务并发问题什么时候发生?
② 事务的并发问题有哪些?
③ 如何避免事务的并发问题?
二、索引什么是索引
索引的优缺点
索引的设计原则
三、数据库设计三大范式第一范式
第二范式
第三范式
四、MySQL的主从复制概念
原理
主从复制用途
五、MySQL中的锁为什么要加锁
锁的分类
六、如何做 MySQL的性能优化
一、事务什么是事务
MySQL事务是一组sql语句或一个独立运行的工作单元。这个工作单元要么全部执行,要么全部不执行。事务的四大特性
原子性:一个事务不可再分割,事务中的所有操作,要么全部完成,要么全部不完成。
一致性:一个事务执行会使数据从一个一致状态切换到另外一个一致状态。也就是说,在事务开始之前和事务结束以后,数据库的完整性没有被破坏。
隔离性:一个事务所做的修改在最终提交之前,对其它事务是不可见的。也就是说一个事务的执行不会受到其它事务的干扰。
持久性:一个事务一旦提交以后,对数据的修改就会永久的保存到数据库中,即便系统故障也不会丢失。
- 事务的并发问题
① 事务并发问题什么时候发生?
当多个事务同时操作同一个数据库的相同数据时,就会发生并发问题。
② 事务的并发问题有哪些?
脏读:对于两个事务T1、T2, T1 读取了已经被T2 更新但还没有被提交的数据。如果事务T2进行了回滚, T1读取到的数据就是临时且无效的。
不可重复读:对于两个事务T1、T2, T1 读取了一个数据, 然后 T2 更新了该数据。如果T1再次读取同一个数据, 值就不相同了。
幻读:对于两个事务T1、T2, T1 从一个表中读取了一个数据, 然后T2 在该表中插入了一些新的行。如果T1 再次读取同一个表, 就会多出几行。
③ 如何避免事务的并发问题?
通过设置事务的隔离级别进行避免事务的并发问题。事务有以下四个隔离级别:
读未提交(read-uncommitted)
读已提交(read-committed) 可以避免脏读
可重复读(repeatable-read) 可以避免脏读、不可重复读和一部分幻读
串行化(serializable) 可以避免脏读、不可重复读和幻读
事务隔离级别 脏读 不可重复读 幻读
读未提交(read-uncommitted) 是 是 是
读已提交(read-committed) 否 是 是
可重复读(repeatable-read) 否 否 是
串行化(serializable) 否 否 否
MySQL数据库(InnoDB引擎)默认使用的隔离级别是:可重复读( Repeatable read );
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。
二、索引
什么是索引
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可以提高数据库中特定数据的查询速度索引的优缺点
优点
① 使用索引可以大大加快数据的查询速度
② 通过创建唯一索引,可以保证数据库表中每一行数据的唯一性。
③ 在使用分组和排序子句进行数据查询时,使用索引可以减少在查询中分组和排序的时间。
缺点
① 创建索引和维护索引需要时间,随着数据量的增加所需要时间也会增加。
② 当对表中的数据进行增加、删除和修改的时候,索引也要动态地维护,这样就降低了数据的维护速度。
③ 索引需要占磁盘空间,除了数据表占数据空间之外,每一个索引还要占定的物理空间,如果有大量的索引,索引文件可能比数据文件更快达到最大文件尺寸
- 索引的设计原则
索引设计不合理或者缺少索引都会对数据库和应用程序的性能造成障碍。高效的索引对于获得良好的性能非常重要。设计索引时,应该考虑以下准则:
① 索引并非越多越好,一个表中如有大量的索引,不仅占用磁盘空间,而且会影响 INSERT、 DELETE、UPDATES等语句的性能,因为当表中的数据更改的同时索引也会进行调整和更新。
② 避免对经常更新的表进行过多的索引,并且索引中的列尽可能少。而对经常用于查询的字段应该创建索引,但要避免添加不必要的字段。
③ 数据量小的表最好不要使用索引,由于数据较少,查询花费的时间可能比遍历索引的时间还要短,索引可能不会产生优化效果。
④ 在条件表达式中经常用到的不同值较多的列上建立索引,在不同值很少的列上不要建立索引。比如在学生表的“性別”字段上只有“男”与“女”两个不同值,因此就无须建立索引。如果建立索引不但不会提高查询效率,反而会严重降低数据更新速度。
⑤ 当唯一性是某种数据本身的特征时,指定唯一索引。使用唯一索引副需能确保定义的列的数据完整性,以提高查询速度。
⑥ 在频繁进行排序或分组(即进行group by或 order by操作)的列上建立索引,如果待排序的列有多个,可以在这些列上建立组合索引。
三、数据库设计三大范式
- 第一范式
确保每列保持原子性
第一范式是最基本的范式。要求数据库表的每一列都是不可分割的原子数据项。
学号 姓名 课程号 课程名 学分 成绩
001 扬帆向海 101 Java 4 80
002 起帆朝阳 102 数据结构 6 90
表一
2. 第二范式
确保表中的每列都和主键相关
第二范式在第一范式的基础上,第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
学号 姓名 课程号 成绩
001 扬帆向海 101 80
002 起帆朝阳 102 90
表二
课程号 课程名 学分
101 Java 4
102 数据结构 6
表三
3. 第三范式
确保每列都和主键列直接相关,而不是间接相关
第三范式是在第二范式的基础上,需要确保数据表中的每一列数据都和主键直接相关,而不是间接相关。
学生表:
学号 姓名
001 扬帆向海
002 起帆朝阳
表四
课程表:
课程号 课程名 学分
101 Java 4
102 数据结构 6
表五
成绩表:
学号 课程号 成绩
001 101 80
002 102 90
表六
四、MySQL的主从复制
概念
MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。原理
在这里插入图片描述
从库生成两个线程,一个I/O线程,一个SQL线程。
I/O线程 去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;
主库会生成一个 log dump 线程,用来给从库 I/O线程传binlog。
SQL线程 会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致。
- 主从复制用途
① 读写分离,在开发工作中,有时候会遇见某个sql
语句需要锁表,导致暂时不能使用读的服务,这样就会影响现有业务,使用主从复制,让主库负责写,从库负责读,这样即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。
② 数据实时备份,当系统中某个节点发生故障时,可以方便的故障切换。
五、MySQL中的锁
为什么要加锁
数据库的锁是为了支持对共享资源进行并发访问,提供数据的完整性和一致性。在数据库中加锁是保证在高并发的情况下,访问数据库的时候,数据不会出现问题。锁的分类
按操作分:
① 读锁(共享锁):针对同一份数据,多个读取操作可以同时进行而不互相影响。
② 写锁(排它锁):当前写操作没有完成前,会阻断其他写锁和读锁。
按粒度分:
① 表锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
② 行锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
③ 页锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
六、如何做 MySQL的性能优化
① 当只需要一条数据的时候,使用 limit 1
② 尽量避免使用 select * ,在查询的时候列出需要查询的字段。
③ 使用 join 代替子查询。
④ 减少使用 or,使用 in 或者 union(union all) 代替。
⑤ 为搜索字段创建索引。但是不要过度索引,索引越多,占用空间越大,反而性能变慢。
⑥ 避免进行类型转换,不然会导致索引失效。
⑦ 对查询语句使用explain 。 使用explain ,可以帮助了解MySQL是如何处理sql语句的, 可以查看到sql的执行计划,这样就能更好的去了解的sql语句的不足,然后优化语句。
⑧ 垂直分割,将常用和有关系的字段放在相同的表中,把一张表的数据分成几张表 这样可以降低表的复杂度和字段的数目,从而达到优化的目的
面试不知道如何回答这六大知识点,你还敢说熟悉MySQL?相关推荐
- 面试官:只是了解的知识点简历上不要写熟悉,否则有你受的
上周面试一位程序员,这位求职者给我留下了深刻印象. 这位求职者的简历有一项是这样写的,熟悉自定义View.他应聘的岗位是Android开发. "你在实际项目开发中有做过自定义View吗?&q ...
- 面向面试的Java后端必会知识点概述及面经
博主本人是非科班硕士,今年三四月份时开始刷题准备找工作.实习加秋招投了很多大厂&中厂,但是有小一半都没能进面试.秋招最终拿到了OPPO提前批测开.腾讯音乐后台开发.阿里云Java开发的offe ...
- 带你全面了解高级 Java 面试中需要掌握的 JVM 知识点
对于一名高级 Java 工程师来说,JVM 可以说是面试必问的一个知识点,而大多数人可能没有对 JVM 的实际开发和使用经验,接下来这一系列文章将带你深入了解 JVM 需要掌握的各个知识点.这也将帮助 ...
- 前端、程序员面试技巧——完美回答
1.请你自我介绍一下你自己? 回答提示: 1)先向面试官问好,比如:您好/上午好/下午好,两人以上说各位面试官大家好,我叫XX. 2)回答思路:一般人回答这个问题过于平常,只说姓名.年龄.爱好.工作经 ...
- 面试最后如何回答“你有什么要问我的吗?”
作者 | 安晓辉 来源 | 安晓辉生涯(ID:programmer_sight) 一般面试到最后,面试官都会问,"你有什么要问我的吗?" 而很多伙伴,其实不大理解为什么面试官要问这 ...
- 机器学习(Machine Learning)、深度学习(Deep Learning)、NLP面试中常考到的知识点和代码实现
网址:https://github.com/NLP-LOVE/ML-NLP 此项目是机器学习(Machine Learning).深度学习(Deep Learning).NLP面试中常考到的知识点和代 ...
- 【果断收藏】16个经典面试问题及回答思路
[果断收藏]16个经典面试问题及回答思路 面试过程中,面试官会向应聘者发问,而应聘者的回答将成为面试官考虑是否接受他的重要依据.对应聘者而言,了解这些问题背后的"猫腻"至关重要.本 ...
- 在面试中如何回答面试官的问题
在面试中如何回答面试官的问题 首先,来个自我介绍: 面试官老师,您好!我叫XXX,是XX大学XX学院的硕士,我的专业是XXXX.我本科就读于XX大学XX专业.我今年X岁,来自XX. 今天我来应聘的岗位 ...
- AUC/ROC:面试中80%都会问的知识点
本文分享自华为云社区<技术干货 | 解决面试中80%问题,基于MindSpore实现AUC/ROC>,原文作者:李嘉琪. ROC/AUC作为机器学习的评估指标非常重要,也是面试中经常出现的 ...
最新文章
- python 显示图片然后延时,python – ROS图像用户滞后
- 比特币现金反弹,区块链是极好机遇
- 用Scikit-learn和TensorFlow进行机器学习(四)
- 让Vs2013 完美支持EF6.1 Code First with Oracle 2015年12月24日更新
- GraphAPI 1.0中新增加的Teams API
- 特老的文章:三层应该怎么划分。不知大家还有用否
- 【Linux】Linux多个关机命令详解
- 高德地图上线车道级导航 华为Mate 40用户可尝鲜体验
- 计算机语言的比较英文论文,科学网—撰写高质量英文科技论文的心态、布局、程序和方法 - 岳中琦的博文...
- Q/A: AD的Kerberos报错
- 100道最新Java面试题,常见面试题及答案汇总
- 使用端口扫描工具消除端口安全威胁
- mysql间隙锁_mysql的间隙锁
- html编辑器菜鸟工具,富文本编辑器TinyMCE菜鸟使用教程
- s3cmd安装配置及基础命令
- 汉语语法与人工智能---数据结构+汉语语法
- ion orphaned memory
- Spring Destroying singletons ... root of factory hierarchy 问题【已解决】
- Goroutine调度器及面试精选
- 面部识别预处理全家桶:mtcnn人脸捕捉、人脸点对齐、仿射运算
热门文章
- leetcode-1-两数之和
- springboot集成mybatis源码分析(一)
- 使用sklearn来处理类别数据
- python中的__iter__ __reversed__ __next__
- 第二章作业-第3题-万世想
- information_schema.routines 学习
- Git 什么时候用什么指令
- 开发海思3520a遇到的问题
- 5g应用场景_5G新媒体场景应用解决方案(ppt)
- 【下载】《看见新力量》第二期,带你走进数十位科技创业者背后的故事