这些 MySQL 面试题你会多少?

SQL herman 362浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

曾经我以为会了增删改查,会了 DML,DDL 就是会了 MySQL。直到现在我才知道,只会 select、update、insert、delete 只是学 MySQL 的一个开始。

只会这些你在面试中根本都拿不出手!今天我们一起来看看,下面这些 MySQL 面试题,你会多少?

1、MySQL 中全局锁 FTWRL 的作用和副作用是什么?

MySQL 的全局锁加锁命令是 Flush tables with read lock (FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命令。但是这个命令会造成以下语句会被阻塞(副作用):数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。

2、MySQL 的 InnoDB 中获得一个一致性视图的方法有多少种?分别是什么?

有多种方法。第一种是加全局锁;Flush tables with read lock (FTWRL)。第二种是在可重复读隔离级别下开启一个事务。第三种就是官方自带的逻辑备份工具是 mysqldump;当 mysqldump 使用参数 –single-transaction 的时候,导数据之前就会启动一个事务,来确保拿到一致性视图。第四种是使用 set global readonly=true 的方式。

3、FTWRL 和 lock tables … read/write 的相同点是什么?

lock tables … read/write 与 FTWRL 类似,可以用 unlock tables 主动释放锁,也可以在客户端断开的时候自动释放。需要注意,lock tables 语法除了会限制别的线程的读写外,也限定了本线程接下来的操作对象。

4、对于 InnoDB 引擎的数据库,逻辑备份一般采用哪种方式?为什么?

逻辑备份一般会采用全局锁,限制整库为只读。对于全部是 InnoDB 引擎的库,建议你选择使用 –single-transaction 参数,对应用会更友好。

因为 set global readonly=true 的方式有时候会被用作其他逻辑,比如用来判断一个库是主库还是备库。另外整个库设置为 readonly 之后,如果客户端发生异常,则数据库就会一直保持 readonly 状态,这样会导致整个库长时间处于不可写状态,风险较高。

而 FTWRL 在执行前有读写的话,FTWRL 都会等待,直到读写执行完毕后才会执行。FTWRL 执行的时候要刷脏页的数据到磁盘,因为要保持数据的一致性。FTWRL 更适合不支持事务的存储引擎。

而 InnoDB 是支持事务的。当使用 mysqldump 并且带上参数 –single-transaction 的时候,导数据之前就会启动一个事务,来确保拿到一致性视图。而由于 MVCC 的支持,这个过程中数据是可以正常更新的。

5、全库只读,为什么不使用 set global readonly=true 的方式?

这个问题,上面第四题已有解答。

set global readonly=true 确实可以让全库进入只读状态,但还是不建议你使用,主要有两个原因。

一是,在有些系统中,readonly 的值会被用来做其他逻辑,比如用来判断一个库是主库还是备库。因此,修改 global 变量的方式影响面更大,因此不建议你使用。

二是,在异常处理机制上有差异。将整个库设置为 readonly 之后,如果客户端发生异常,则数据库就会一直保持 readonly 状态,这样会导致整个库长时间处于不可写状态,风险较高。

通过我海报上的二维码扫描购买后加xttblog微信,返现24

更多关于 MySQL 的高级面试题请打开下面的小程序进行阅读。或者你也可以通过购买极客时间的《MySQL实战45讲》进行学习。扫描下方海报上的二维码,购买后加我微信号:xttblog,备注“返现”。我返你微信 24 元红包。

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,之前的微信号好友已满,请加博主新的微信号:xttblog,备注:“xttblog”,添加博主微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » 这些 MySQL 面试题你会多少?