2022年最新mysql面试题附答案,建议收藏

2023-06-01 00:00:00 建议 面试题 答案

1. MySQL 索引使用有哪些注意事项呢?

索引哪些情况下会失效

查询条件包含or 会导致索引失效

组合索引中,查询时要按照最左原则进行where条件判断

like中 “%asdg"会导致索引失效

对索引进行函数操作或加减会导致索引失效

*索引中使用!= 或者 not in 会失效

*隐式转换也会失效 比如字段是int 却用where age=‘1’


不适用的场景

数据量少的情况下不建议用索引

离散低的不建议用索引如 sex 男女

频繁更新的字段不建议加索引


2. MySQL 遇到过死锁问题吗,你是如何解决的?

步骤:

查看死锁日志show engine innodb status;

找出死锁sql

分析sql加锁情况

模拟死锁案发

分析死锁日志

分析死锁结果


3. 日常工作中你是怎么优化SQL的?

加索引

查询条件包含or 会导致索引失效

组合索引中,查询时要按照最左原则进行where条件判断

like中 “%asdg"会导致索引失效

对索引进行函数操作或加减会导致索引失效

对索引进行函数操作或加减会导致索引失效

索引中使用!= 或者 not in 会失效

数据处理多时要分批次进行

尽量避免使用2个表以上的join

满足三大范式

主从复制读写分离

分表分库 -…


4. 分库分表的设计

应该是先按业务垂直分库 再到按业务垂直分表 然后就是 按字段水平分表

水平分库:以字段为依据,按照range、hash策略,将一个库中的数据拆分到多个库中

水平分表:以字段为依据,按照range、hash策略,将一个表中的数据拆分到多个表中

垂直分库:以表为依据,按照业务归属不同,将不同的表拆到不同的库中

垂直分表:以字段为依据,按照字段的活跃性,将表中字段拆到不同的表中

-分表分库常用中间件 sharding-jdbc 和 mycat


5. InnoDB与MyISAM的区别

// 事务 索引 锁

I 支持事务,M不支持事物

I 支持外键,M不支持外键

I 支持MVCC,M不支持

select count(*) from table 时 M快,因为他有一个变量存着表的总行数,I需要全表扫描

I 支持表 行锁,M只支持表锁


6. 数据库索引的原理,为什么要用 B+树,为什么不用二叉树?

1)当数据量大时,树的高度会比较高(树的高度决定着它的IO操作次数,IO操作耗时大),查询会比较慢。

2)每个磁盘块(节点/页)保存的数据太小

7. 聚集索引与非聚集索引的区别

一个表中只能拥有一个聚集索引,而非聚集索引一个表可以存在多个。

聚集索引,索引中键值的逻辑顺序决定了表中相应行的物理顺序;非聚集索引,索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同。


8. limit 1000000 加载很慢的话,你是怎么解决的呢?

如果id是连续的,可以返回上次查询的最大记录,再往下limit

在业务允许的情况是下限制页数 ,是否需要如此靠后的数据

order by + 索引 (id为索引)


9. 如何选择合适的分布式主键方案呢?

UUID

雪花算法

Redis生成ID


10. 事务的隔离级别有哪些?MySQL的默认隔离级别是什么?

读脏:一个事务对数据进行了修改但未提交,另一个事务也在访问这个数据并且读到了修改的数据 

不可重复读:A事务多次读,B事务在A读取中修改了数据,可能造成结果不一致 

幻读:一个事务在读取某一范围数据的时候,另一个事务在该范围内插入了新行,再次读取的时候与之前的数据不一致

不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。

解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表


读未提交

这种事务隔离级别下,select语句不加锁,此时可能不一致的数据,读脏。是并发最高,一致性最差的隔离级别

读提交 RC

可能会出现幻读

可重复读 RR

无论读几次都不会读到重复的数据

串行化

如果有未提交的事务正在修改某些行,所有读取这些行的select就会被堵塞住,一致性最好的,但并发性最差的隔离级别。


11. 在高并发情况下,如何做到安全的修改同一行数据?

使用悲观锁

for update ,本次事务提交之前,别的线程都无法修改这些记录

使用乐观锁

有线程进来,先放过去修改,如果看到别的线程没修改过,就可以修改成功。如果别的线程修改过,就修改失败或者重试


12. 数据库的乐观锁和悲观锁

悲观锁 ,任何事务都不能对数据进行修改,只能等待锁被释放后才能执行

乐观锁,先把线程放进来,如果没有其他线程对数据进行修改则可以修改成功,否则修改失败或者重试。


13. SQL优化的一般步骤是什么,怎么看执行计划(explain),如何理解其中各个字段的含义?

show status 了解各种sql的执行频率

通过慢日志定位那些执行效率低的sql语句

explain分析低效的sql执行计划


14. select for update有什么含义, 锁表还是锁行还是其他?

是悲观锁,用索引是行锁,没有是表锁


15. MySQL事务得四大特性以及实现原理

原子性:要么全部执行,全部不执行

一致性:事务开始前后,数据不会被破坏

隔离性:事务与事务之间互相隔离,不会冲突

持久性:会永久的保存到数据库中


16. 如果某个表有近千万数据,CRUD比较慢,如何优化?

优化sql语句,加索引,适当反三范式,适当冗余

可以将一部分常用的数据存到redis中

主从复制,读写分离

水平分库分表,垂直分库分表


17. 如何写sql能够有效的使用到复合索引?

注意查询sql条件的顺序,确保最左匹配原则有效


18. mysql中in 和exists的区别

如果子查询的表数据比主查询中的少,适合用in。如果子查询的表数据比主查询中的多,适合用exists


19. 数据库自增主键可能遇到什么问题?

使用自增主键进行分表分库时,会造成主键重复问题,可以使用UUID。

自增主键可能会用完


20. MVCC底层原理

MVCC只在RC和RR下才有效。

? 在每个表的后面有三个隐藏字段 行ID、事务ID、回滚指针

? ReadView由未提交的事务ID数组和已提交的最大事务ID组成


ReadView策略不同:

? RC下每执行一次select都会重新生成一个ReadView。

? RR下只会在第一次select执行时生成,后续沿用第一次的ReadView


版本链:

? 在版本链中拿出最上面的事务ID开始逐个进行对比

? 有一个最小事务ID和最大事务ID。分别在已提交事务和未提交事务区间边缘。中间夹着未提交和已提交事务


? 当这个版本的事务ID比最小事务小时,则是可见的。

? 当这个版本的事务ID比最大事务大时,则是不可见的。

? 落在中间时,有两种情况

? 第一种:在未提交事务中,是不可见的

? 第二种:在已提交事务中,是可见的


21. 数据库中间件了解过吗,sharding jdbc,mycat?

sharding-jdbc基于jdbc驱动,无需额外的proxy。Mycat基于proxy


22. MySQL的主从延迟,你怎么解决?

主从复制分了五个步骤进行:

主库的更新写入到binlog

从库发起连接,连接到主库

主库创建一个binlog dump thread发送到从库,将binlog发送的从库

从库创建一个I/O线程,读取主库传来的binlog内容写入到relay log

从库创建一个sql线程,从relay log中读取内容,将内容写入到从库

这种问题,注意了。划重点。问你出现问题,寻找解决方案的时候,一定要对症下药,也就是说这个问题你可以这样考虑,什么情况下导致的主从延迟。


如果主库和从库服务器配置不一样,从库的差点,那么就可能导致延迟时间加长。这时候,换成相同的服务器配置服务器即可。

从库压力太大了。一般主从了,从库基本用来查询,比如可能运营或者开发者自己都在从库上进行一系列的 sql 操作。那简单呗。多配几个从库,分摊压力,一主多从。

大事务。比如 delete 这种语句 不 limit 限制一下,如果数据量过大,导致主库运行时都花费了长时间,再同步到从库,这个时间间隔过长。


23. 说一下大表查询的优化方案

分表分库,sql优化+索引 加缓存 ,主从复制读写分离 同16


24. 什么是数据库连接池?为什么需要数据库连接池呢?

数据库连接池原理:在内部对象池中,维护一定数量的数据库连接,并对外暴露数据库连接的获取和返回方法

资源重用

提高响应速度

统一管理,避免数据库链接泄漏


25. 一条SQL语句在MySQL中如何执行的?

先连接到数据库

查询缓存,大多数情况下不建议用缓存,因为缓存失效很频繁

分析器,如果没有命中缓存,就需要对语句及逆行解析

优化器,经过优化器进行处理,优化器是在表里面有多个索引时,决定使用哪个索引,或者一个语句有多表关联时。

执行器,判断表是否有查询权限,如果有,则根据表的引擎定义,去使用这个引擎提供的接口


26. InnoDB引擎中的索引策略,了解过吗?

覆盖索引:

? 在普通索引树中可以得到查询的结果,不需要在回到主键索引树中再次搜索

? 如果select * from table where age between 12 and 25,这样会回表再查一次

? select id from table where age between 12 and 25,就不会进行回表。减少了搜索次数,叫做覆盖索引


最左前缀:

? 原则就是经常用的列有优先

? 离散型高的优先

? 宽度小的列优先


索引下推:

? 在索引遍历过程中,会对索引包含的字段先判断,直接过滤掉不满足条件的记录。减少回表次数


27. 数据库存储日期格式时,如何考虑时区转换问题?

datetime 类型适用于数据原始的创建时间,修改其他字段值时,datetime 字段不会改变

timestamp 类型会记录数据最后一次修改的时间,且自动更新


28. 一条sql执行过长的时间,你如何优化,从哪些方面入手?

是否用到了多表和子查询,优化sql结构,比如除去冗余字段

优化索引结构,是否可以适当增加索引

分表分库

explain分析sql语句

主从复制 读写分离

查看mysql 慢日志


29. Blob和text有什么区别?

Blob用于存储二进制数据,text用于存储大字符串数据

Blob被当作二进制字符串数据,没有字符集,并且排序和比较基于列值中的字节数值

text被当作非二进制字符串,有一个字符集,并根据字符集的排序规则对值进行排序和比较


30. MySQL里记录货币用什么字段类型比较好?

decimal / numeric


31. InnoDB有哪几种锁?

常见锁问题:

行锁超时:

SQL优化,有效利用索引减少SQL执行时间

及时提交事务,避免长事务占用锁资源不释放

代码优化,同一事务中,将执行时间长的sql放到最后


表锁超时:

1)尽量避免表级锁操作;

2)高并发情况下导致的表锁等待可考虑相关SQL优化

3)DDL变更操作尽量在业务低峰执行;

4)DDL执行期间,关注数据库会话运行情况,避免DDL变更相关表涉及的长事务/大查询阻塞DDL操作峰进行


尽量

共享锁和排他锁

如果没有指定某行,两个都是行锁否则就是表锁

share: for share 允许多个事务同时读同一记录,互不干扰,但不允许加其他锁

exclusive: for update 只有一个事务可以写数据


意向锁 Intention

未来某个时间要加 share/ exclusive 锁

是一个表级别的锁


记录锁 Record

封锁索引记录 for update 防止其他事务插入更新删除

间隙锁 gap

封锁索引记录中的间隔,防止其他事务在间隔中插入数据,RR级别下导致不可重复读

插入意向锁 insert intention

在行插入之前由插入操作设置的一种间隙锁

自增锁 auto-inc

-AUTO-INC锁是一种特殊的表级锁,由插入到具有自动增量列的表中的事务使用。


下一个键锁(临界锁) Next-Key

临键锁,是记录锁与间隙锁的组合,它的封锁范围,既包含索引记录,又包含索引区间。

更具体的,临键锁会封锁索引记录本身,以及索引记录之前的区间。


32. Hash索引和B+树区别是什么?你在设计索引是怎么抉择的?

B+支持范围搜索

B+支持联合索引的最左原则

B+支持order by

B+支持like模糊

hash等值查询效率高


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

内连接,只返回匹配的结果集

左连接,返回左表的所有行,即时右表没有匹配的记录

右连接,返回右表的所有行,即时左表没有匹配的记录


34. 什么是内连接、外连接、交叉连接、笛卡尔积呢?

内连接(inner join):取得两张表中满足存在连接匹配关系的记录。

外连接(outer join):取得两张表中满足存在连接匹配关系的记录,以及某张表(或两张表)中不满足匹配关系的记录。

交叉连接(cross join):显示两张表所有记录一一对应,没有匹配关系进行筛选,也被称为:笛卡尔积。


35. 说一下数据库的三大范式

数据库表的每一列都是不可拆分的

在1的基础上 每一列都与主键直接相关

在2的基础上,每一列数据都与主键直接相关


36. mysql有关权限的表有哪几个呢?

user权限表:记录允许连接到服务器的用户帐号信息,里面的权限是全局级的。 db权限表:记录各个帐号在各个数据库上的操作权限。 table_priv权限表:记录数据表级的操作权限。 columns_priv权限表:记录数据列级的操作权限。 host权限表:配合db权限表对给定主机上数据库级操作权限作更细致的控制。这个权限表不受GRANT和REVOKE语句的影响。


37. 主从复制binlog格式有哪几种?有什么区别?

STATEMENT,基于语句的日志记录,把所有写操作的sql语句写入 binlog (默认)

ROW,基于行的日志记录,把每一行的改变写入binlog

MIXED,混合模式


38. Mysql主从复制方式?有什么区别?

STATEMENT,基于语句的日志记录,把所有写操作的sql语句写入 binlog (默认)

ROW,基于行的日志记录,把每一行的改变写入binlog

MIXED,混合模式


39. InnoDB内存结构包含四大核心组件

(1)缓冲池(Buffer Pool);

(2)写缓冲(Change Buffer);

(3)自适应哈希索引(Adaptive Hash Index);

(4)日志缓冲(Log Buffer);


40. 索引有哪些优缺点?

唯一索引可以保证数据库表中每一行数据的唯一性

索引可以加快查询速度,减少查询时间

创建索引和维护索引需要时间

表中数据进行增删改时,索引也要动态的维护


41. 索引有哪几种类型?

主键索引:数据列不允许重复 不允许为空 只能有一个主键

唯一索引:数据列不允许重复 允许为空 可以创建多个索引

普通索引: 允许为空 可以创建多个索引

全文索引:可以对文本的内容进行分词,搜索

覆盖索引:查询列要被所建的索引覆盖,不必读取数据行

组合索引:多个列组成一个索引,用于组合搜索


42. 创建索引的三种方式

create index index_name on table table_name(column)
alter table table_name add index index_name(column)


43. 百万级别或以上的数据,你是如何删除的?

先删除表中的索引,在删除数据,在创建索引


44. 覆盖索引、回表等这些,了解过吗?

覆盖索引:查询列要被所创建的索引覆盖,这样查询数据时不会去查询数据列

回表:二级索引无法直接查询所有列的数据,所以通过二级索引查询到聚簇索引后,再查询到想要的数据,这种通过二级索引查询出来的过程,就叫做回表。


45. B+树在满足聚簇索引和覆盖索引的时候不需要回表查询数据?

当查询使用聚簇索引时,不需要回表查询


46. 何时使用聚簇索引与非聚簇索引

聚簇索引


47. 非聚簇索引一定会回表查询吗?

不一定,如果查询语句的字段全部命中了索引,那么就不必再进行回表查询

举个简单的例子,假设我们在学生表的上建立了索引,那么当进行select age from student where age < 20的查询时,在索引的叶子节点上,已经包含了age信息,不会再次进行回表查询。


48. 组合索引是什么?为什么需要注意组合索引中的顺序?

组合索引:由多个列创建的索引。索引策略是最左原则


49. 什么是死锁?怎么解决?

有P1P2两个进程,都需要A和B两个资源,现在P1持有A等待B,P2持有B等待A,现在两个都等待另一个资源而不肯释放资源,就会无限等待,导致死锁

1:尽量避免同时锁定两个资源

2: 必须同时锁定两个资源时,要保证在任何时刻都应该按照相同的顺序来锁定资源.

死锁是指两个或以上的事务占用同一资源并请求锁定对方资源,从而导致形成恶性循环的现象

死锁的四个必要条件:互斥,请求和保持,环路等待,不剥夺。解决思路是切断环路


50. 你是如何监控你们的数据库的?你们的慢日志都是怎么查询的?

zabbix,lepus

mysql 分区有哪几种

RANGE:属于一个给定的连续区间的列值被放入分区。

LIST:和RANGE分区相似,只是分区列的值是离散的。

HASH:将数据均匀的分布到预先定义的各个分区中,保证每个分区的数量大致相同。

KEY:和HASH相似,KEY分区使用数据库提供的函数进行分区。


51.索引底层是什么数据结构?

B + 树。

为什么用的是 B + 树,不能使用红黑树或者其他的?

可以使用红黑树。但是这样的话可能会造成树的高度过高,意味着相同查询下,会进行更多的磁盘 I/O,影响性能,而 B+ 树可以保持树的高度不至于过高


52.一条查询sql以主键查和二级索引查区别

1、如果查询语句是 select * from table where ID = 100,即主键查询的方式,则只需要搜索 ID 这棵 B+树。

2、如果查询语句是 select * from table where k = 1,即非主键的查询方式,则先搜索k索引树,得到ID=100,再到ID索引树搜索一次,

这个过程也被称为回表。


53.说一说Mysql最左前缀匹配

建立联合索引时会遵循最左前缀匹配的原则

对abc三列建立联合索引

实际是建立了a ab abc 三个索引

对量大的数据表,可以减少开销


54.现在有3张表,1个主表,2个副表,主表数据大概在1W左右,副表大概在1000W和2000W左右,怎么优化?

首先,确保每条数据不会产生null值,然后合理建立索引,合理写SQL,避免select *之类的方式,用什么就取什么。

Mysql给一个大表加一列_MySQL 大表添加一列的实现


55.5.6之前, 加触发器自动完成. 5.6及之后, 使用在线DDL语句

CREATE TRIGGER person_trigger_update AFTER UPDATE ON 原有表 FOR EACH ROW
BEGIN
        SET @x = "trigger UPDATE";
    REPLACE INTO 新表 SELECT
    * 
    FROM
        原有表 
    WHERE
        新表.id = 原有表.id;
END IF;
END;
ALTER TABLE 你的表 ADD COLUMN 新列 char(128), ALGORITHM=INSTANT, LOCK=NONE;
https://blog.csdn.net/weixin_31842775/article/details/114351029


56.怎么加读写锁

LOCK TABLE my_table_name READ; 用读锁锁表,会阻塞其他事务修改表数据。

LOCK TABLE my_table_name WRITe; 用写锁锁表,会阻塞其他事务读和写。


57.B-树、B+树、B*树都是什么

? B-树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点;

? 所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;

? B+树:在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中;

? B*树:在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从1/2提高到2/3;


58.MYSQL和 MONGO区别

数据库 MongoDB MySQL

数据库模型 非关系型 关系型

存储方式 以类JSON的文档的格式存储虚拟内存+持久化 不同引擎有不同的存储方式

查询语句 MongoDB查询方式(类似JavaScript的函数) SQL语句

架构特点 可以通过副本集,以及分片来实现高可用(在副本集中,当主库遇到问题,无法继续提供服务时,副本集将选举一个新的主库继续提供服务, 高可用和集群架构拥有十分高的扩展性) 常见有单点,M-S,MHA,MMM,Cluster等架构方式

数据处理方式 基于内存,将热数据存放在物理内存中,从而达到高速读写 不同引擎有自己的特点处理海量数据效率先住变慢

成熟度 新兴数据库,成熟度较低 成熟度高

广泛度 NoSQL数据库中,比较完善且开源,使用人数在不断增长 开源数据库,市场份额不断增长

事务性 仅支持单文档事务操作,弱一致性(本身没有带事务机制,需要在MongoDB中实现事务机制,需要通过一个额外的表,从逻辑上自行实现事务) 支持事务操作

占用空间 占用空间大 占用空间小

join操作 MongoDB没有join MySQL支持join

Mysql占用cpu过高

show processlist语句,查找cpu占用最高的SQL语句,优化该SQL,比如适当建立某字段的索引

打开慢查询日志,将那些执行时间过长且占用资源过多的SQL拿来进行explain分析

考虑定时优化文件及索引

考虑是否是锁问题

如果数据量过大,可以考虑使用MySQL集群或者搭建高可用环境。


59.Inoodb快照读和当前读

快照读:读取的是记录的可见版本(有可能是历史版本),不加锁。

当前读:读取的是记录的最新版本,并且当前读返回的记录都会加上锁,保证其他事务不会再并发修改这条记录。

快照读实现:mvcc

当前读实现:主要靠加锁(行记录锁+间隙锁)实现,保证其他事务不会再并发修改这条记录。


转:

https://4927525.github.io/post/mst/mysql/

相关文章