mysql 去重复查询_MYSQL高级面试题

前言

mysql是一个开源数据库,生态比较丰富,更多的厂商都把数据迁移到mysql上。数据库对于程序开发来说必不可少,面试题必问,大家一定要多多装备,好了开始我们的面试。

2791ed9b741bac0aa459b2497803ed1a.png

a8658f696ca266b0d74fb4bb1687cb54.png

面试题

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

 三范式是我们建立数据库的根本,为了建立冗余小,结构合理额数据库我们必须要遵循他的规则。第一范式:确保每列都要保证原子性,比如地址包含省市县,那么将字段拆分为三个第二范式:确保每列都要与主键有关系。说白了每个表只能存储一类数据。第三范式:确保每列与主键要有直接关系。表中存储关联字段存储对方主键。

2.说一下ACID 是什么?

数据库事物的四大特征:

原子性:事物执行的最小单元,要摸全部执行成功,要摸全部执行失败。

一致性:事物开始前和结束后,数据库数据完整性没有得到破坏

隔离性:数据库允许多个事物并发的对数据进行读写和修改能力,但是会通过事物之前的隔离性质防止事物与事物数据之前的交叉冲突

持久性:事物处理结束后,对数据库数据修改是持久化的不会丢失

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

char是固定长度,varchar是可变长度。char在存储时没有沾满则后续用空格作为占位符。

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

float单精度浮点数,double双精度浮点数。double精度比float精度要高2倍左右,但是占用内存空间也是两倍左右。

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

内连接获取两张表交集的数据,左连接获取的是左表所有的数据,右表显示符合筛选条件的数据组合。右连接和左连接相反显示右表所有数据,左表显示符合条件数据。

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

MyisamInnodb

Myisam支持全文索引但是不支持事物,表级锁

Innodb支持事物,行级锁。

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

mysql所有分类:主键索引,唯一索引,组合索引,全文索引,普通索引

Mysql支持的索引类型:BTree索引,B+TREE索引,hash索引,全文索引

 hash索引通过获取该列值得到hashCode码对应value存储数据行所在位置,这个查找起来非常快,可以通过值得hashCode获取到数组下标,数组存储的是一个key,value。key:值,value:所在物理行,但是呢不能支持范围查找和快速排序,因为是散列存放没有顺序和范围查找功能。

 重点看下BTree和B+Tree

mysql的InnoDb搜索引擎默认使用B+Tree作为索引的实现,BTree索引根节点子节点,叶子节点都会存储数据。但是B+Tree只有叶子节点才会存储数据,如果不是主键索引则为副本索引,副本索引存储的是此数据行对应的主键索引值,再去主键索引查找物理行数。

7.mysql的聚簇索引和非聚簇索引的区别?

在Myisam引擎中使用的是非聚簇索引,在Innodb中使用的是聚簇索引

非聚簇索引根节点和分支节点存储Key的节点位置,叶子节点存储Key对应数据表物理行位置。数据文件与索引文件是区分开的

聚簇索引是叶子节点存储行数据,每一张表只有一个聚簇索引就是主键聚簇索引。辅助索引本质上也是B+TREE但是叶子节点存储的数据是key:主键值,然后通过主键值再去寻找主键索引查询数据。

 这块索引原理还是需要大家多去看看资料这里偷了个图仅供参考:

3b19e8dffc4ad3b4ede15e219621ecf8.png

接着我们看下B+TREE的构建过程

B+TREE构建过程:加入一个5阶B+树,那么根节点有m-1也就是4个关键字

660a982dedbd37181f975a0761b02ff1.png

1e1c0075f64ec02ea925891ade7f95a2.png

e6a55ca661e9ff27b5a74816c1beafa1.png

79946f6780250da092bbf52afa033556.png

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

通过查看Explain函数结果,将Explain关键字放到sql语句前面执行后查看type结果以及possible_keys中所用到的索引。这个没有试过的同学试一下。

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

事物的隔离级别划分为四类:读未提交,读已提交,可重复读串行化

读未提交:事物可以读取到另外一个事物未提交的数据导致脏读

读已提交:事物能读取到另外一个事物已提交的数据可能导致不可重复读取

可重复读:行级锁,当一个事物操作一条数据时,其他事物不能同时操作该条数据

串行化:表级索,事物只能排队对数据表进行操作

mysql默认的隔离级别为可重复读,当然我们生产环境一般设置为读已提交,已经提交的数据是允许读取的。

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

表锁是直接把整张表锁定,性能开销小,但是事物间并发特别高

行锁只是针对某一行数据加锁开锁,性能消耗较大,但是并发降低:

行锁分为共享锁和排它锁;共享锁多个事物都可以获取但是只允许读取不能操作。排它锁是同一时刻只能有一个事物获取,其他事物等待或者自旋,获取排它锁的事物可以进行增删改查,默认增删改数据库都会加上排它锁,如果隔离级别是读已提交则当其他事物获取锁后,当前事物会获取到commit最新版本重写读取一遍需要操作的数据,但是可重复读隔离级别则会将未获取到锁的事物等待

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

乐观锁就是某条数据大家都可以进行修改,但是在事物提交前判断如果其他事物修改了此条数据则不能再继续提交事物。比如修改语句中加上某个字段原始值。

悲观锁是对于某条数据进行行级锁定,其他事物查询此条数据将被阻塞。比如select for update。

这里要说的挺重要一点:普通的SELECT * FROM XXX WHERE XXXX=XXXX这个没有任何锁机制,即便某条数据被加锁也不会影响正常的查询。

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

插入优化:

1.尽量一次性批量插入减少事物操作日志

2.批量插入尽量保证顺序插入,尤其是主键我们一般不主动生成值由数据库来自增,因为主键有聚簇索引所以当插入是乱序的话B+TREE构建过程可能产生分裂和合并操作,如果是顺序插入则B+TREE一直会往固定方向构建。

查询优化:

1.查询条件是否走索引,比如where a is null 则会进行全表扫描,尽量给null值设定一个默认值0

2.索引优化:尽量使用重复率低的字段作为索引

3.表横向拆分:数据量大的表根据某个业务字段进行拆分

4.对于100W级别数据进行分页查询,一个是冷热数据将一部分数据缓存到redis中,一种方式是计算主键范围通过beetween进行检索减少Limit的对于表行扫描

目前整理了12道Mysql常见的面试题,其中有很多原理,比如B+树构建索引的过程,聚簇索引和非聚簇索引,面试题回答我只是按照我的理解描述了大概原理,细节性的原理还是需要大家去查阅资料,有对面试题回答有疑问或者有更好的面试题可以直接发送消息到公众号,我会一一回复。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值