MySQL高频面试整理

1.什么是MVCC
多版本并发控制
在这里插入图片描述
在这里插入图片描述
标记、回滚、生成没有主键的B+树索引
在这里插入图片描述

2.数据库索引的数据类型
在这里插入图片描述

3.什么是ACID?
原子性、一致性、隔离性、持续性

4.为什么用B+数(B+数的好处)
二叉树:索引字段有序,极端情况会变成链表形式

AVL数:树的高度不可控

B数:控制了树的高度,但是索引值和data都分布在每个具体的节点当中,若要进行范围查询,要进行多次回溯,IO开销大

B+树:非叶子节点只存储索引值,叶子节点再存储索引+具体数据,从小到大用链表连接在一起,范围查询可直接遍历不需要回溯

5.Explain的作用
使用 EXPLAIN 关键字可以模拟优化器执行 SQL 查询语句,从而知道 MySQL 是如何处理要查询的SQL 语句,来分析查询语句或是表结构的性能瓶颈

6.ABC 最左前缀匹配的联合索引问题
MySQL 建立联合索引的规则是这样的,它会首先根据联合索引中最左边的、也就是第一个字段进行排序,在第一个字段排序的基础上,再对联合索引中后面的第二个字段进行排序,
MySQL 会一直向右匹配直到遇到范围查询(> , < ,between,like)就停止匹配

7.mysql事物隔离级别

在高并发情况下,并发事务会产生脏读、不可重复读、幻读问题,这时需要用隔离级别来控制

未提交读: 允许一个事务读取另一个事务未提交的数据,可能出现脏读、不可重复读,幻读。(读其他其他事务未提交的最新版本,因为可能会回滚,所以可能脏读(读到无效数据))

提交读: 只允许事务读取另一个事务已提交的数据可能出现不可重复读,幻读。(读到最新已提交版本)

可重复读: 在事务范围中,多次读能保证一致性可能出现欢幻读,可以加锁避免。(快照建立時,最新已提交版本)

可串行化:
在这里插入图片描述

Inno DB 默认隔离级别为可重复读级别,分为快照度和当前读,并且通过间隙锁解决了幻读问题
脏读:事务一先查询,事务2修改数据但未提交,事务1再读但数据改变了,如果这时事务2回滚,则1读到的数据是无效的就是脏读
不可重复读:事务1先读,事务2修改数据但提交了,事务1查询结果不一致,则为不可重复读
幻读:事务1先读,事务2插入一条数据,因为是可重复读级别,有快照,则事务1再读还是两条数据,这时事务1想再插入数据,会报错。使用for update加锁或串行读来避免幻读现象。

8.如何选择事务隔离级别?

隔离级别越低,事务请求的锁越少相应性能也就越高,如没有特殊要求或有错误发生,使用默认的隔离级别即可,如果系统中有高频读写并且对一致性要求高那么就需要比较高的事务隔离级别甚至串行化

9…什么是快照读和当前读

快照读读取的是当前数据的可见版本,可能是会过期数据,不加锁的select就是快照都(读取某一个快照建立时(某一时间点)的数据)
*当前读读取的是数据的最新版本,并且当前读返回的记录都会上锁,保证其他事务不会并发修改这条记录。如update、insert、delete、select for undate(排他锁)、select lockin share mode(共享锁) 都是当前读(读取最新提交的数据)
在这里插入图片描述

10.InnoDB和MyISAM的区别

InnoDB有三大特性,分别是事务、外键、行级锁,这些都是MyIsAm不支持的,

另外InnoDB是聚簇索引,MyIAm是非聚簇索引,

InnoDB不支持全文索引,MyIAm支持

InnoDB支持自增和MVCC模式的读写,MyIAm不支持

MyIsAM的访问速度一般InnoDB快,差异在于innodb的mvcc、行锁会比较消耗性能,还可能有回表的过程(先去辅助索引中查询数据,找到数据对应的key之后,再通过key回表到聚簇索引树查找数据)

11.聚簇索引和非聚簇索引的区别

聚簇索引:聚簇索引的叶子节点存放的是主键值和数据行;辅助索引(在聚簇索引上创建的其它索引)的叶子节点存放的是主键值或指向数据行的指针。

优点:根据索引可以直接获取值,所以他获取数据更快;对于主键的排序查找和范围查找效率更高;

缺点:如果主键值很大的话,辅助索引也会变得很大;如果用uuid作为主键,数据存储会很稀疏;修改主键或乱序插入会让数据行移动导致页分裂;所以一般我们定义主键时尽量让主键值小,并且定义为自增和不可修改。

非聚簇索引(辅助索引):叶子节点存放的是数据行地址,先根据索引找到数据地址,再根据地址去找数据

他们都是b+数结构

https://www.nowcoder.com/discuss/371669692237316096?sourceSSR=search

12.MySQL索引失效
数据类型隐式转换
模糊查询 like 以%开头
or前后没有同时使用索引
联合索引,没有使用第一列索引
在索引字段进行计算操作
在索引字段字段上使用函数
优化器选错索引
https://www.nowcoder.com/discuss/410017686476898304?sourceSSR=search

13.左、右连接

左连接是左边表的所有数据都有显示出来,右边的表数据只显示共同有的那部分,没有对应的部分只能补空显示,所谓的左边表其实就是指放在left join的左边的表
在这里插入图片描述

查询出左表和右表所有数据,但是去除两表的重复数据
在这里插入图片描述
14. 左连接会出现重复的数据吗

会的,左表和右表是一对多的情况下,符合要求的数据可能就会有重复,就会出现重复数据。

15.mysql索引的原则

在这里插入图片描述

16.数据库的乐观锁和悲观锁是什么
之所以叫做悲观锁,是因为这是一种对数据的修改抱有悲观态度的并发控制方式。我们一般认为数据被并发修改的概率比较大,所以需要在修改之前先加锁。悲观并发控制实际上是“先取锁再访问”的保守策略,为数据处理的安全提供了保证。

乐观锁假设数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。不会产生任何锁和死锁

17.主从复制原理

在这里插入图片描述
简化为:
master将改变记录到二进制日志(binary log)
slave将master的binary log拷贝到它的中继日志(relay log)
slave重做中继日志中的事件,将改变应用到自己的数据库中

18.为什么要分库分表
分表
在这里插入图片描述
分库
在这里插入图片描述

在这里插入图片描述

19.慢SQL怎么看使用到什么索引(执行计划)
用explain分析慢sql查看他用到了什么索引。

20.什么情况下要建索引,怎么建?
1.主键自动建立唯一索引;

2.频繁作为查询条件的字段应该创建索引;

3.查询中与其他表有关联的字段,例如外键关系;

4.频繁更新的字段不适合创建索引,因为每次更新不单单是更新记录,还会更新索引,保存索引文件;

5.where条件里用不到的字段,不创建索引;

6.高并发的情况下一般选择复合索引;

7.查询中排序的字段创建索引将大大提高排序的速度(索引就是排序加快速查找);

8.查询中统计或者分组的字段;

21.B树和B+树的区别

在这里插入图片描述

22.有一张表需要快速统计有多少条记录,该用那种存储引擎?

对于需要快速统计表中记录总数的情况,可以使用 InnoDB 存储引擎,因为 InnoDB 存储引擎支持行级锁,可以避免表锁定和死锁的问题,同时也支持MVCC,可以提高并发性能。而 MyISAM 存储引擎的表级锁定机制可能会导致并发性能下降,因此不太适合快速统计表中记录总数的情况。

在 InnoDB 存储引擎中,可以使用以下两种方式来快速统计表中记录总数:

使用 COUNT 函数统计表中记录总数。例如:

SELECT COUNT(*) FROM your_table_name;

使用 INFORMATION_SCHEMA 库中的表来获取表中记录总数。例如:

SELECT TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = ‘your_table_name’;

其中,TABLE_ROWS 列表示表中记录总数。

总之,在需要快速统计表中记录总数的情况下,建议使用 InnoDB 存储引擎,并使用上述两种方法之一来获取表中记录总数。

23.什么情况下要建索引,怎么建?

数据量大的表:对于数据量大的表,建立索引可以提高查询效率,减少查询时间。

经常进行查询的字段:对于经常进行查询的字段,建立索引可以减少数据库的扫描次数,提高查询效率。

频繁进行排序或分组的字段:对于频繁进行排序或分组的字段,建立索引可以提高排序或分组的效率。

不同的查询条件需要建立不同的索引:对于不同的查询条件,需要建立不同的索引,以提高查询效率。

在建立索引时,可以使用 SQL 语句来创建索引,例如:

CREATE INDEX idx_name ON table_name(column_name);
其中 idx_name 是索引名称,table_name 是表名称,column_name 是要建立索引的字段名称。

24、mysql怎么调优?
1、优化查询语句
2、在经常查询的列上创建索引
3、调整mysql缓存大小,减少磁盘Io操作
4、优化表结构,避免使用冗余字段和过多表连接
5、提升硬件,CPU、内存、硬盘等
6、监控mysql性能指标,如QPS等

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值