java面试题:MYSQL篇

本文介绍了MySQL中的慢查询定位方法,SQL执行计划分析,索引的原理与创建原则,包括B+树、聚簇索引、非聚簇索引、覆盖索引等。还探讨了并发事务问题、事务隔离级别、MVCC机制以及主从同步原理,以及在实际项目中的分库分表策略。
摘要由CSDN通过智能技术生成

1.MYSQL中如何定位慢查询

我们当时是用了运维的监控系统skwaling,他可以查看sql中那条语句执行比较慢,还有一种方法就是,mysql中自己定义了慢日志功能,我们可以设置设置将超过几秒的sql语句给写入到慢日志中,这样就可以看出那个sql执行慢。

2.一条SQL执行很慢我们如何分析呢?

一条sql执行慢的话,我们可以使用explain执行计划分析其原因,他会将一条sql语句形成一张报表,让我们查看其状态,比如我们可以通过key和key_len来分析是否命中索引或者索引是否失效,通过type字段来确认sql是否能进一步优化,通过exter来确认是否有回表的情况。

3.了解过索引吗?索引的底层结构了解过吗?

索引是很常见的,他主要作用是为了MYSQL高效获取数据的一种数据结构,主要就是提高检索效率,降低io成本和cpu利用率。

索引的底层结构是采用innoDB的B+树,选择B+树的原因有三个:1.阶数多,路径短。2.便于扫库和区间查询。3.磁盘读写代价低,叶子节点存储数据,非叶子节点存储指针。

4.B树和B+树的区别

B树的话他的叶子节点和非叶子节点都存储数据,B+数的话,只在叶子节点存储数据,非叶子节点存储指针,而且B+树的效率更高。

5.什么是聚族索引和非聚簇索引?

聚簇索引指的是数据和索引存放到一起,B+树的叶子节点保存了整行数据,有且只有一个,一般是主键作为聚簇索引。

非聚簇索引指的是数据和索引不存在一起,B+树的叶子节点保存对应的主键,可以有多个,一般我们自定义的索引都是非聚簇索引。

6.什么是回表查询?

这个与聚簇索引和非聚簇索引有关,二级索引查找到对应的主键,主键在通过聚簇索引确定整行数据,这个过程就叫做回表。

7.什么是覆盖索引?

覆盖索引指的是用select查询语句使用了索引,在返回的列中,必须在索引中全部能够找到,如果我们使用Id查询,他会走聚集索引查询。一次扫面,直接返回数据,性能高。

8.MYSQL超大分页怎么处理?

超大分页一般是在数据量大的时候使用,我们使用了limit分页查询,并且需要对数据进行排序,这样查询效率会变低,我们可以使用覆盖索引和子查询解决。

先分页查询数据的id,确定Id之后再通过子查询过滤,只查询这个Idl列表中的数据即可。

9.索引的创建原则有哪些?

索引一般是在数据量巨大的时候使用,一般是数据量超过10万的时候就会使用索引,并且添加索引的字段都是使用比较频繁的,我们通常创建索引的时候都是通过复合索引创建的,,一条sql的返回语句尽量使用覆盖索引。

10.什么情况下索引会失效?

这个就很多了,比如没有遵循最左匹配原则,模糊查询时,%在最前面索引也会失效,使用复合索引中间使用了范围查询,右边的索引也会失效。

11.SQL优化的经验?

这个是比较常用的,sql优化考虑一下几个方面:建表的时候,使用索引的时候,sql语句的编写,主从复制,读写分离。       

12.你平时对sql语句做了哪些优化?

使用select查询语句时尽量不要使用select*,要精确到字段查询。

13.事务的特性是什么?可以详细说一下嘛?

ACID:原子性,一致性,隔离性,持久性。

举个例子:A向B转账500元,转账成功A-500,B+500,原子性体现在要么都成功要么都是失败。

A转账成功后,总额是不变的,就是A-500,B+500,保持总额一致。隔离性就体现在,AB转账期间,其他事物是不能干预的。持久性就体现在,转账成功后,在不转给别人的情况下,余额是持久不变的。

14.并发事务带来了哪些问题?

并发事务带来的问题主要有三种:脏读,不可重复读,幻读。

脏读:事务A在读取数据,并且对数据进行修改,但还未上传数据库,这时事务B也在读取这个数据,因为事务A修改之后还未上床数据库,所以事务B读取的数据时不准确的,这个称为脏读。

不可重复读:一个事务A多次访问同一个数据,比如事务A两次访问数据,在完成第一次访问后,将要进行第二次访问时,事务B也在访问这个数据,并对其进行修改,事务A第二次访问时,读取到的数据与第一次不同,这叫做不可重复读。

幻读:与不可重复读相似,事务A在第一次访问之后,将要进行第二次访问时,事务B访问了该数据,并对其添加了一些数据,当事务A第二次访问的时候,发现了一些不存在的数据,这个叫做幻读。

15.怎么解决并发事务带来的问题?MYSQL默认隔离级别是?

解决并发问题就是对事务进行隔离。

隔离级别的话有四个级别:1.读未提交,他解决不了并发事务的问题。2.读已提交,他可以解决脏读问题。3.可重复读:他可以解决脏读和不可重复读问题。4.串行化:他可以解决脏读,不可重复读和幻读问题。

在日常使用中我们我们默认的级别是可重复读,因为串行化的性能比较低。

16.undo log和redo log的区别

redo log日志记录的是数据页的物理变化,当服务宕机后可以用来同步数据,而undo log是记录数据页的逻辑变化,当事务回滚时,他可以通过逆操作恢复数据。

17.事物的隔离性是如何保证的?(解释一下MVCC)

事务的隔离性是由锁和mvcc实现的

mvcc急死多版本并发控制吗,指维护一个数据的多个版本,使得读写操作没有冲突,他的底层实现分为三个部分:1.隐藏字段,2.undo log日志,3.readView读视图。

18.MYSQL主从同步原理

MYSQL主从复制的核心就是二进制日志(DDL数据定义语言和DML数据操作语言)他的步骤是这样的:1.主库在提交事务的时候,会把数据变更记录在二进制日志文件binlog中。2.从库读取主库中的binlog日志,并把他写入从库中的中继日志relay log。3.从库重做中继日志的事件,将改变反应他自己的数据。

19.你用过MYSQL的分库分表吗?

因为我们都是微服务开发,每个微服务对应一个数据库,是根据业务进行拆分的,这个其实就是垂直拆分。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值