MySQL面试常见题目(七)

原文地址:MySQL面试常见题目(七)

1、500台数据库如何快速重启?

  1. 使用批量ssh工具pssh对需重启的机器执行指令。

  2. 使用salt或ansible等多线程工具同时操作多台服务器。

2、一6亿表a,一3亿表b,通过外键tid关联,如何快速查询出满足条件的第50000到50200中这200条数据?

假设一:a的tid是自增长且连续的,b的id字段为索引,SQL如下:

select * from a,b where a.tid = b.id and a.tid>500000 limit 200;

假设二:a的tid是不连续的,需使用覆盖索引,tid要么是索引,要么是辅助索引,b的id也需要有索引,SQL如下:

select * from b , (select tid from a limit 50000,200) a where b.id = a.tid;

3、SQL加锁分析:

  1. 组合一:id列是主键,RC隔离级别。

  2. 组合二:id列是二级唯一索引,RC隔离级别。

  3. 组合三:id列是二级非唯一索引,RC隔离级别。

  4. 组合四:id列上没有索引,RC隔离级别。

  5. 组合五:id列是主键,RR隔离级别。

  6. 组合六:id列是二级唯一索引,RR隔离级别。

  7. 组合七:id列是二级非唯一索引,RR隔离级别。

  8. 组合八:id列上没有索引,RR隔离级别。

  9. 组合九:Serializable隔离级别。

4、redo和undo日志存放位置?

  1. redo:页修改时先写到redo log buffer中,之后写到redo log的文件系统缓存里(fwrite),再同步到磁盘(fsync)。

  2. undo:在MySQL5.5之前undo只能放在ibdata文件里,5.6之后,可通过设置参数innodb_undo_tablespaces将undo log存放在ibdata里。

5、事务是如何通过日志实现的?

  1. 事务在修改页时,要先undo,undo之前先记录undo的redo,之后修改数据页,在记录修改数据页的redo,redo里包括undo的修改,redo一定比数据页先持久化到磁盘。

  2. 当事务需回滚时,有undo可把数据页恢复到前镜像的状态,崩溃恢复时,如redo log中事务并无对应的commit记录,则需用undo将修改内容恢复到事务开始前。

  3. 如有commit记录,则用redo回滚到事务完成时的状态并提交。

6、什么是表分区?

表分区,是指根据一定规则,将数据库中的一张表分解成多个更小的,容易管理的部分,从逻辑上看,只有一张表,但是底层却是由多个物理分区组成。

7、表分区和分表的区别?

分表:指的是通过一定规则,将一张表分解成多张不同的表,比如将用户订单记录根据时间成多个表。

分表与分区的区别在于:分区从逻辑上来讲只有一张表,而分表则是将一张表分解成多张表。


8、表分区有什么好处?

  1. 存储更多数据。分区表的数据可以分布在不同的物理设备上,从而高效地利用多个硬件设备。和单个磁盘或者文件系统相比,可存储更多数据。

  2. 优化查询。在where语句中包含分区条件时,可只扫描一个或多个分区表来提高查询效率,涉及sum和count语句时,也可在多个分区上并行处理,最后汇总结果。

  3. 分区表更容易维护。例如:想批量删除大量数据可以清除整个分区。

  4. 避免某些特殊的瓶颈,例如InnoDB的单个索引的互斥访问,ext3问价系统的inode锁竞争等。

9、判断当前MySQL是否支持分区?

show variables like '%partition%'

至此,本次分享就结束了,后期会慢慢补充的。

以上仅为个人观点,不一定准确,能帮到各位那是最好的。

好啦,到这里本文就结束了,喜欢的话就来个三连击吧。

扫码关注公众号,获取更多优质内容。

  

Guess you like

Origin blog.csdn.net/luyaran/article/details/121231646