这些 MySQL 面试题你会多少?

第一时间获取技术干货和业界资讯!

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

只会这些你在面试中根本都拿不出手!今天我们一起来看看,下面这些 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 状态,这样会导致整个库长时间处于不可写状态,风险较高。

更多关于 MySQL 的高级面试题请打开下面的小程序进行阅读。

猜你喜欢

转载自blog.51cto.com/15127565/2666217
今日推荐