mysql 面试问题总结
一条 sql 执行慢的原因
- 偶尔执行慢
- 某行记录上锁
- 数据库在刷新脏页(日志写满需要同步到磁盘)
- 一直执行慢
- 索引失效,一直没走索引。例如该字段没有索引;由于对字段进行运算、函数操作导致无法用索引
- 数据库选错了索引。
MySQL 事务实现原理
- redo log 和 undo log
1.redo用于恢复数据的 用于保障已提交事务的持久化特性。
2. undo用来回滚数据的用于保障 未提交事务的原子性
- mysql锁技术以及MVCC基础
1.读多写少的情况。使用读写锁机制,读读可以并行,但是不能做到写读,写写并行
2.MVCC多版本控制:每行记录后面保存两个隐藏的列来实现。。这两个列,一个保存了行的创建时间,一个保存了行的过期时间,当然存储的并不是实际的时间值,而是系统版本号。
- 事务的实现原理
1.MVCC在mysql中的实现依赖的是undo log与read view
-
undo log :undo log 中记录某行数据的多个版本的数据。
-
read view :用来判断当前版本数据的可见性
-
MySQL的数据存储机制,MySQL的表数据是存放在磁盘上的,因此想要存取的时候都要经历磁盘IO,然而即使是使用SSD磁盘IO也是非常消耗性能的。为此,为了提升性能InnoDB提供了缓冲池(Buffer Pool),Buffer Pool中包含了磁盘数据页的映射,可以当做缓存来使用:
读数据:会首先从缓冲池中读取,如果缓冲池中没有,则从磁盘读取再放入缓冲池;
写数据:会首先写入缓冲池,缓冲池中的数据会定期同步到磁盘中;
-
MySQL隔离级别有以下四种(级别由低到高):
-
READUNCOMMITED(未提交读) 事务中的修改即使还没提交,对其他事务是可见的。事务可以读取未提交的数据,造成脏读。
-
READCOMMITED(提交读) 在一个事务内多次读取的结果不一样。
-
REPEATABLEREAD(可重复读)
(Mysql默认隔离级别)
在一个事务内的多次读取的结果是一样的
-
SERIALIZABLE (可重复读)
实现事务采取了哪些技术以及思想?
-
原子性:使用 undo log ,从而达到回滚
-
持久性:使用 redo log,从而达到故障后恢复
-
隔离性:使用锁以及MVCC,运用的优化思想有读写分离,读读并行,读写并行
-
一致性:通过回滚,以及恢复,和在并发环境下的隔离做到一致性。
服务器发生OOM怎么排查?
- 如果生产环境JVM挂了,这时候不要慌,有节奏的来分析来排除。首先排除是不是被Linux杀死了,怎么看呢?通过命令[sudo egrep -i -r 'Out Of' /var/log]查看,如果是,关闭一些服务,或者把一些服务移走,腾出点内存。
- 有没有生成dump文件。如果生成了,要么是堆OOM,要么是元空间OOM;如果没生成,直接可以确定是直接内存导致的OOM
- dump文件从服务器上下载下来,用visualvm分析。
- 如果你发现发生OOM的位置是创建对象,调用构造方法之类的代码,那一定是堆OOM。
- 如果你发现发生OOM的位置是类加载器那些方法,那一定是元空间OOM。