mysql 面试总结

2022-02-09  本文已影响0人  lincoln_hlf1

1. 事务

ACID 特性

隔离级别

2. 索引

Mysql 的索引分类

聚集索引、非聚集索引、主建的区别

有哪些情况会让索引失效?

最左匹配原则是指?

mysql 建立联合索引后,是按最左匹配原则来筛选记录的,即检索数据是从联合索引的第一个字段来筛选的。如果 where 里的条件只有第二个字段,那么将无法应用到索引。

索引的底层数据结构 B+ 树是怎么样的?

B+ 树是二叉搜索树的一个扩充,是多路搜索树。它只在叶子节点存储具体的数据或者数据的指向指针,而非叶子节点存放索引数据。这样可以降低磁盘 IO,还能充分利用磁盘的预读功能,批量的加载索引数据。

B+ 树

b 树 b+树 b-树的区别

为什么不能在重复率高,例如性别字段上建立索引?

对于性别这种索引, 由于重复率高,对于 B+树(多路搜索树)来讲,得遍历多条路径,搜索代价大。还不如全表扫描,这样不需要维护索引,降低开销。

Mysql 的 hash 索引是怎么样,有什么优缺点?

hash 索引将列通过 hash 运算得到 hash code,然后将 hash code 跟数据行的指针地址关联在一起,下次查找时只需查找对应 hash code 的数据行地址即可。

hash 索引非常的紧凑,查找速度很快,适用于内存存储引擎的应用。不过它只能精确查询,不支持范围查找,也不能直接进行排序。限制还是挺多的。

hash 索引

Mysql 的全文索引

全文索引主要是用于文档查找,像我们可能会从多篇文章中查找包含某些词语的文章,这时就可以使用全文索引了。虽然 like 也可以使用,但是效率太低了。全文索引在接收到文档时,会对它进行分词处理,以获取到关键词。然后会将关键词和属于这个文档的 id 关联起来。下次查找,就会先到关键词列表里找到关联的文档 id ,最后利用文档 id 去查找到文档数据。

3. 日志

日志类别

redo log 相关概念:writepos、checkpoint、prepare、commit

redo log 是用来记录当前数据页的修改情况,由于性能问题,每次修改并不会实时同步到硬盘。而是先在内存中修改,然后将修改情况记录到 redo 里,再定时的去将 redo 刷新到硬盘里。因此,redo log 有 2 个位置,一个是 writepos,自己写日志的位置;另一个是 checkpoint,是定时的将数据页同步到硬盘的位置。

redo log 在写 binlog 日志前会先记录 redo log,记录完后标记为 prepare 状态。当 binlog 也写入完成后,才将 redo log 标记为 commit 状态。只有当 redo log 是 commit 状态时,事务才能真正的 commit。这样能防止主从节点根据 binlog 同步有可能事务不一致的情况。

4. Mysql 里的锁

Mysql 里的锁有哪些?

乐观/悲观锁

共享/排它锁

表锁/行锁

行锁

上面的间隙锁、临建锁有效的防止了事务幻读情况产生,避免了在查找期间有数据新增或删除。

意向锁

表锁的一种,它仅仅表示一种操作意向。当我们使用粒度比较小的行锁时,在检测是否有锁时,需要一行一行的检查,效率较低。有了意向锁之后,则不需一行一行的排查,只需检测对应的意向锁即可。

事务里锁的应用是怎么样的?

可重复读

可重复读使用的是 MVCC 快照,所以在读取数据时大多数时候不需要使用锁。

但使用了 UPDATE, DELETE,或 SELECT with FOR UPDATE(排它锁) 或 FOR SHARE(共享锁),则会根据下面的情况来使用锁:

读提交

也是使用 MVCC 机制来读取数据,不过在使用 UPDATE, DELETE,或 SELECT with FOR UPDATE(排它锁) 或 FOR SHARE(共享锁)时和上面的机制不一样,当存储引擎将筛选到的记录交给 mysql server 层后,会对不相干的数据进行解锁,所以不会涉及间隙锁或临建锁。它们只会在做外键约束检查和重复键检查时使用到。由于间隙锁的禁用,可能会出现幻读现象。

未提交读

在 mysql 的 innodb 存储引擎里做 SELECT操作不会做任何锁动作,如果是 myisam 存储引擎,则会上共享锁。
如果使用UPDATE, DELETE,或 SELECT with FOR UPDATE(排它锁) 或 FOR SHARE(共享锁)则和读提交一样的原则。

可序列化读

可序列化读在使用 select 时,一般会自动的转化为 SELECT ... FOR SHARE(共享锁),以保证读写序列化。

lock in share mode 和 for update 里间隙锁什么时候会应用?

锁超时的配置

当 mysql 获取锁超时时候,如果系统变量 innodb_rollback_on_timeout 为 off ,则当前事务只会回滚最后一条 sql, 所以建议设置 innodb_rollback_on_timeout 为 on, 这样在获取锁超时时可以回滚全部 sql。

5. MVCC 是指什么?

MVCC 即多版本并发控制,它利用了 undo log 会在数据修改时保留上一个修改记录指针的特点,使得每个事务对数据的修改能有自己的历史版本追溯,就像镜像备份一样。当进行读操作时,如果有其他写操作的事务并发进行,那么此时可以根据事务的隔离级别选择读取最新版本亦或自己之前版本的数据。MVCC 不需要加锁的,它能提高事务的并发处理能力。

6. mysql 的复制技术

7. 存储引擎

Mysql 存储引擎有哪些以及特点?

myisam 存储引擎和 innodb 的区别

8. Mysql 的三层架构

9. 执行计划是什么?怎么看?

执行计划是 mysql 根据我们的查询语句进行一系列的分析后得到的优化方案。我们可以通过执行计划来获取执行过程。

执行计划的获取:

explain select 语句

[图片上传失败...(image-abc1fb-1644421977238)]

涉及的字段含义如下:

其中,有个 type 字段,它的含义大概如下:

从上面大概就能分析出索引的使用情况了,如果是 all,那就是没有用到索引了。

10. SQL 注入的现象是?

在拼接 SQL 语句时,直接使用客户端传递过来的值拼接,如果客户端传来包含 or 1=1 类似的语句,那么就会筛选到非预期的结果,进而达到欺骗服务器的效果。

解决方案是使用现在数据库提供的预编译(prepare)和查询参数绑定功能,例如使用占位符 ?,然后将带有占位符的 SQL 语句交给数据库编译,这样数据库就能知道要执行的是哪些语句,条件值又是哪些,而不会混杂在一起。

11. UNION 和 UNION ALL 的区别?

12. 为什么尽量使用自增 ID,而不是 UUID?

自增 ID 是由有序的,而 UUID 是无序的,如果该字段作为索引,那么就会很容易打破 B+ 树的平衡,进而不断的在进行磁盘数据页的调整,导致性能下降

13. 分库分表有哪些?有什么优缺点?

分库分表后使得数据不再集中到一张表上,但也带来了维护以及其他处理问题。比如原来的事务变为分布式事务;原来的 join 操作将要变为在应用层序做过滤;还有数据的后续迁移、扩容规划等。

14. 内连接、外连接区别

15. 常见的数据库优化


感兴趣的朋友可以搜一搜公众号「 阅新技术 」,关注更多的推送文章。
可以的话,就顺便点个赞、留个言、分享下,感谢各位支持!
阅新技术,阅读更多的新知识。

上一篇 下一篇

猜你喜欢

热点阅读