2020最新超全MySQL笔记整理(面试题+思惟导图+笔记)

做为一名编程人员,对MySQL必定不会陌生,尤为是互联网行业,对MySQL的使用是比较多的。对于求职者来讲,MySQL又是面试中必定会问到的重点,不少人拥有大厂梦,却由于MySQL败下阵来。实际上,MySQL并不难,今天这份最全的MySQL总结,助你向大厂“开炮”,面试再也不被MySQL难倒。面试加油!!!java

因为篇幅有限,如下只展现小部分面试题,有须要完整版的朋友能够点一点连接跳转领取:连接:点这里!!!暗号:CSDNweb

在这里插入图片描述

索引相关

1. 什么是索引?
索引是一种数据结构,能够帮助咱们快速的进行数据的查找.面试

2. 索引是个什么样的数据结构呢?
索引的数据结构和具体存储引擎的实现有关, 在MySQL中使用较多的索引有Hash索引,B+树索引等,而咱们常用的InnoDB存储引擎的默认索引实现为:B+树索引.spring

3. Hash索引和B+树索引有什么区别或者说优劣呢?sql

首先要知道Hash索引和B+树索引的底层实现原理:数据库

hash索引底层就是hash表,进行查找时,调用一次hash函数就能够获取到相应的键值,以后进行回表查询得到实际数据.B+树底层实现是多路平衡查找树.对于每一次的查询都是从根节点出发,查找到叶子节点方能够得到所查键值,而后根据查询判断是否须要回表查询数据.编程

那么能够看出他们有如下的不一样:安全

hash索引进行等值查询更快(通常状况下),可是却没法进行范围查询.
由于在hash索引中通过hash函数创建索引以后,索引的顺序与原顺序没法保持一致,不能支持范围查询.而B+树的的全部节点皆遵循(左节点小于父节点,右节点大于父节点,多叉树也相似),自然支持范围.数据结构

hash索引不支持使用索引进行排序,原理同上.
hash索引不支持模糊查询以及多列索引的最左前缀匹配.原理也是由于hash函数的不可预测.AAAA和AAAAB的索引没有相关性.
hash索引任什么时候候都避免不了回表查询数据,而B+树在符合某些条件(聚簇索引,覆盖索引等)的时候能够只经过索引完成查询.
hash索引虽然在等值查询上较快,可是不稳定.性能不可预测,当某个键值存在大量重复的时候,发生hash碰撞,此时效率可能极差.而B+树的查询效率比较稳定,对于全部的查询都是从根节点到叶子节点,且树的高度较低.架构

所以,在大多数状况下,直接选择B+树索引能够得到稳定且较好的查询速度.而不须要使用hash索引.

4. 上面提到了B+树在知足聚簇索引和覆盖索引的时候不须要回表查询数据,什么是聚簇索引?

在B+树的索引中,叶子节点可能存储了当前的key值,也可能存储了当前的key值以及整行的数据,这就是聚簇索引和非聚簇索引. 在InnoDB中,只有主键索引是聚簇索引,若是没有主键,则挑选一个惟一键创建聚簇索引.若是没有惟一键,则隐式的生成一个键来创建聚簇索引.

当查询使用聚簇索引时,在对应的叶子节点,能够获取到整行数据,所以不用再次进行回表查询.

5. 非聚簇索引必定会回表查询吗?

不必定,这涉及到查询语句所要求的字段是否所有命中了索引,若是所有命中了索引,那么就没必要再进行回表查询.
举个简单的例子,假设咱们在员工表的年龄上创建了索引,那么当进行select age from employee where age < 20的查询时,在索引的叶子节点上,已经包含了age信息,不会再次进行回表查询.

在这里插入图片描述

事务相关

1. 什么是事务?

理解什么是事务最经典的就是转帐的例子,相信你们也都了解,这里就再也不说一遍了.

事务是一系列的操做,他们要符合ACID特性.最多见的理解就是:事务中的操做要么所有成功,要么所有失败.可是只是这样还不够的.

2. ACID是什么?能够详细说一下吗?

A=Atomicity
原子性,就是上面说的,要么所有成功,要么所有失败.不可能只执行一部分操做.

C=Consistency
系统(数据库)老是从一个一致性的状态转移到另外一个一致性的状态,不会存在中间状态.

I=Isolation
隔离性: 一般来讲:一个事务在彻底提交以前,对其余事务是不可见的.注意前面的一般来讲加了红色,意味着有例外状况.

D=Durability
持久性,一旦事务提交,那么就永远是这样子了,哪怕系统崩溃也不会影响到这个事务的结果.

3. 同时有多个事务在进行会怎么样呢?

多事务的并发进行通常会形成如下几个问题:

解读: A事务读取到了B事务未提交的内容,而B事务后面进行了回滚.
不可重复读: 当设置A事务只能读取B事务已经提交的部分,会形成在A事务内的两次查询,结果居然不同,由于在此期间B事务进行了提交操做.
幻读: A事务读取了一个范围的内容,而同时B事务在此期间插入了一条数据.形成"幻觉".

4. 怎么解决这些问题呢?MySQL的事务隔离级别了解吗?

MySQL的四种隔离级别以下:

未提交读(READ UNCOMMITTED)
这就是上面所说的例外状况了,这个隔离级别下,其余事务能够看到本事务没有提交的部分修改.所以会形成脏读的问题(读取到了其余事务未提交的部分,而以后该事务进行了回滚).
这个级别的性能没有足够大的优点,可是又有不少的问题,所以不多使用.

已提交读(READ COMMITTED)
其余事务只能读取到本事务已经提交的部分.这个隔离级别有 不可重复读的问题,在同一个事务内的两次读取,拿到的结果居然不同,由于另一个事务对数据进行了修改.

REPEATABLE READ(可重复读)
可重复读隔离级别解决了上面不可重复读的问题(看名字也知道),可是仍然有一个新问题,就是 幻读,当你读取id> 10 的数据行时,对涉及到的全部行加上了读锁,此时例外一个事务新插入了一条id=11的数据,由于是新插入的,因此不会触发上面的锁的排斥,那么进行本事务进行下一次的查询时会发现有一条id=11的数据,而上次的查询操做并无获取到,再进行插入就会有主键冲突的问题.

SERIALIZABLE(可串行化)
这是最高的隔离级别,能够解决上面提到的全部问题,由于他强制将因此的操做串行执行,这会致使并发性能极速降低,所以也不是很经常使用.

5. Innodb使用的是哪一种隔离级别呢?
InnoDB默认使用的是可重复读隔离级别.

6. MySQL都有哪些锁呢?像上面那样子进行锁定岂不是有点阻碍并发效率了?
因为篇幅有限,只展现小部分,有须要完整版的朋友能够点一点连接跳转领取,还有更多面试资料免费分享给你们:连接:点这里!!!暗号:CSDN

在这里插入图片描述

表结构设计

1. 为何要尽可能设定一个主键?
主键是数据库确保数据行在整张表惟一性的保障,即便业务上本张表没有主键,也建议添加一个自增加的ID列做为主键.设定了主键以后,在后续的删改查的时候可能更加快速以及确保操做数据范围安全.

2. 主键使用自增ID仍是UUID?
推荐使用自增ID,不要使用UUID.
由于在InnoDB存储引擎中,主键索引是做为聚簇索引存在的,也就是说,主键索引的B+树叶子节点上存储了主键索引以及所有的数据(按照顺序),若是主键索引是自增ID,那么只须要不断向后排列便可,若是是UUID,因为到来的ID与原来的大小不肯定,会形成很是多的数据插入,数据移动,而后致使产生不少的内存碎片,进而形成插入性能的降低.
总之,在数据量大一些的状况下,用自增主键性能会好一些.
图片来源于《高性能MySQL》: 其中默认后缀为使用自增ID,_uuid为使用UUID为主键的测试,测试了插入100w行和300w行的性能.

在这里插入图片描述

关于主键是聚簇索引,若是没有主键,InnoDB会选择一个惟一键来做为聚簇索引,若是没有惟一键,会生成一个隐式的主键.

If you define a PRIMARY KEY on your table, InnoDB uses it as the clustered index.
If you do not define a PRIMARY KEY for your table, MySQL picks the first UNIQUE index that has only NOT NULL columns as the primary key and InnoDB uses it as the clustered index.

3. 字段为何要求定义为not null?

MySQL官网这样介绍:

NULL columns require additional space in the rowto record whether their values are NULL. For MyISAM tables, each NULL columntakes one bit extra, rounded up to the nearest byte.

null值会占用更多的字节,且会在程序中形成不少与预期不符的状况.

4. 若是要存储用户的密码散列,应该使用什么字段进行存储?

密码散列,盐,用户身份证号等固定长度的字符串应该使用char而不是varchar来存储,这样能够节省空间且提升检索效率.

存储引擎相关

1. MySQL支持哪些存储引擎?

MySQL支持多种存储引擎,好比InnoDB,MyISAM,Memory,Archive等等.在大多数的状况下,直接选择使用InnoDB引擎都是最合适的,InnoDB也是MySQL的默认存储引擎.

InnoDB和MyISAM有什么区别?

InnoDB支持事物,而MyISAM不支持事物
InnoDB支持行级锁,而MyISAM支持表级锁
InnoDB支持MVCC, 而MyISAM不支持
InnoDB支持外键,而MyISAM不支持
InnoDB不支持全文索引,而MyISAM支持。

在这里插入图片描述

零散问题

1. MySQL中的varchar和char有什么区别.

2. varchar(10)和int(10)表明什么含义?

3. MySQL的binlog又有几种录入格式?分别有什么区别?

4. 超大分页怎么处理?

5. 关心过业务系统里面的sql耗时吗?统计过慢查询吗?对慢查询都怎么优化过?

6. 上面提到横向分表和纵向分表,能够分别举一个适合他们的例子吗?

7. 什么是存储过程?有哪些优缺点?

8. 说一说三个范式

9. MyBatis中的

最后:

为了帮助你们更好的面试和学习,这边整理了一份 架构师全套视频教程 和关于java的系统化资料,从Javase- ssm-springcloud,包括java核心知识点、面试专题和20年最新的互联网真题、电子书等都有,对于想学习Java或者想转行的朋友、大学生都很是实用,免费分享给你们~有须要的朋友能够点一点下方连接免费领取!

连接:点这里!!!暗号:CSDN

在这里插入图片描述
在这里插入图片描述