MySql面试题总结

MySQL主要考察方向

· 基本SQL的编写能力

· 数据库锁和索引的原理

· 事务

MySql

1.数据库的三范式是什么?

第一范式:表中的列只能含有原子性(每个属性不可再分)的值。

每一列都是单独的属性,不可再分,但是存在数据冗余大,插入异常,删除异常,修改异常的问题。

冗余大:对应的属性都一样,在表中一直在重复这个属性值

插入异常:想单独创建若干个与主键无关的属性集,但是因为必须输入主键所以插入异常

删除异常:删除主键后,对应的属性数据也删除了

修改异常:如果修改其中一个属性,为保持一致性,也要连同修改其他几个属性

第二范式:在1NF基础上,消除了非主属性对于码的部分函数依赖

完全函数依赖是非主属性值需要依赖主属性的全部属性确认

部份依赖只需要主属性中一部分属性确认

传递函数依赖:A – >B , B – >C 如果通过A属性(属性组)的值,可以确定唯一的B属性的值,再通过B属性(属性组)的值,可以唯一确定C属性的值,那么称C传递依赖于A

第三范式(3NF):在2NF的基础上,任何的非主属性不依赖于其他非主属性 (在第二范式基础上消除传递依赖)

2.一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?

Innodb只把自增主键最大ID记录到内存中,重启后插入ID为6

而MyISAM记录是8,因为MylSAM表会把自增主键的最大ID记录到数据文件里面,就算重启,自增主键ID也不会消失

3.如何获取当前数据库版本?

4.说一下 ACID 是什么?

原子性(Atomicity):事务是一个不可分割的单位,事务的操作要么都完成要么都不完成

一致性(Consistency):事务前后的数据的完整性必须保持一致

隔离性(Isolation):事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

脏读:一个事务处理过程中读取了另一个事务中未提交的数据。是读取了另一个事务的数据

不可重复读:指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值。例如事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发送了不可重复读。读取了前一个事务的数据

虚读(幻读):事务T1修改一定范围数据,事务T2增加一条数据,而T1修改后T2新加的数据并未修改

四种隔离级别设置

设置描述
Serializable(串行化)可避免脏读、不可重复读、虚读情况的发生。
Repeatable read(可重复读)可避免脏读、不可重复读情况的发生。
Read committed(读已提交)可避免脏读情况发生。
Read uncommitted(读未提交)最低级别,以上情况均无法保证。

持久性(Durability):一个事务一旦被提交,对数据库中数据的改变是永久性的,即使数据库发生故障也不会有影响。

5.char 和 varchar 的区别是什么?

char是固定长度,而varchar是非固定长度可变换。char的查询速度快于varchar,因为长度固定,方便存储和查询,用空间换时间,而varchar是以空间为首位

6.float 和 double 的区别是什么?

float单精度浮点 4字节、double双精度浮点8字节

float -2128~2128 double -21024~21024

小数默认为double类型,float要加f后缀

7.mysql 的内连接、左连接、右连接有什么区别?

内连接:获取两个表中字段匹配关系的记录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3A5smjet-1593339750171)(file:///C:/Users/10145/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif)]
左连接:获取左表所有记录,即使右表没有对应匹配的记录[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3N6bOCH8-1593339628950)(file:///C:/Users/10145/AppData/Local/Temp/msohtmlclip1/01/clip_image003.png)]

右连接:获取右表所有记录,即使左表没有对应匹配的记录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gfYxNMf5-1593339628952)(file:///C:/Users/10145/AppData/Local/Temp/msohtmlclip1/01/clip_image004.gif)]

全外连接:(左右2张表都不加限制)

8.mysql 索引是怎么实现的?

使用B+树作为索引结构,希望查询效率高并且不占用太多空间,因为虽然存储在内存的磁盘访问速度很快,但是当表的数量增加,内存不足以放下索引,则需要存储在硬盘中,用时间换空间,这时候用二叉查找树效率就低很多(深度深),树的高度等于查询数据时磁盘IO操作次数,所以使用B+树(m叉树),使得树更加扁平,m 值是根据页面的大小事先计算好的。通过双向链表(支持前后遍历)将叶子节点串联在一起,这样可以方便的按区间查找,用磁盘多占用一倍指针空间微不足道,时间提升;B+树的叶子节点存储的是索引。

9.怎么验证 mysql 的索引是否满足需求?

使用 explain 查看 SQL 是如何执行查询语句的,从而分析你的索引是否满足需求。 explain 语法:

explain select * from table where type=1。

10.说一下数据库的事务隔离?

数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性,可能出现问题为脏读、不可重复读、幻读,都是数据库读一致性问题,必须由事务提供隔离机制来解决。事务隔离越严格,并发副作用小,但是效率变慢。避免不可重复读需要锁行(某一行在select操作时,不允许update与delete)就行,避免幻读则需要锁表。mysql数据库所默认的级别为可重复读

11.说一下 mysql 常用的引擎?

常用的引擎主要就是2个:Innodb和MyIASM

\1. InnoDB 支持事务,MyISAM 不支持事务。MyISAM是非事务安全的,而InnoDB是事务安全的

\2. MyISAM相对简单,效率上要优于InnoDB,小型应用可以考虑使用MyISAM

\3. 索引使用的都是B+树(叶子节点只存储数据文件指针),叫非聚集索引,不过innodb也是用B+树,不过数据结构中存储的都是数据。

\4. InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。而MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;MyISAM支持全文类型索引,而InnoDB不支持全文索引

\5. InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。InnoDB更适合高并发场景、事务处理,但是小型应用用MyISAM,效率更高。InnoDB使用索引作为检索条件修改数据时采用行锁,否则采用表锁

12.说一下 mysql 的行锁和表锁?

表锁虽然开销小,锁表快,但高并发下性能低。

行锁虽然开销大,锁表慢,但高并发下相比之下性能更高。

事务和行锁都是在确保数据准确的基础上提高并发的处理能力。

共享锁(读锁):多用于判断数据是否存在,多个读操作可以同时进行而不会互相影响。使数据可读不可写。

排他锁(写锁):当前写操作没有完成前,它会阻断其他写锁和读锁。使数据不可读不可写

13.说一下乐观锁和悲观锁?

读得多,冲突少,乐观锁

乐观锁实现方法:版本号机制、CAS算法

版本号机制:每次修改数据前,读version号,提交更新时比对刚刚读取的值,若相同则更新成功,不同则回滚事务。

CAS算法(compare and swap(比较与交换)):出名的**无锁算法,**拿副本中的预期值与主存中的值作比较,如果相等就继续替换新值,如果不相等就说明主存中的值已经被别的线程修改,就继续重试;

写得多,冲突多,悲观锁:给数据库加锁

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O5gAZ72y-1593339628955)(file:///C:/Users/10145/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg)]

14.mysql 问题排查都有哪些手段?

以后再说

15.如何做 mysql 的性能优化?

1、建立合适的索引

说明主存中的值已经被别的线程修改,就继续重试;

写得多,冲突多,悲观锁:给数据库加锁

[外链图片转存中…(img-O5gAZ72y-1593339628955)]

14.mysql 问题排查都有哪些手段?

以后再说

15.如何做 mysql 的性能优化?

1、建立合适的索引

2、开启慢查询日志,记录执行速度慢的SQL语句,优化SQL语句

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值