两道常见的MySQL面试题


数据库相关的题目频频出现在各大公司的技术岗位面试中,而且内容变化多端,让面试的小伙伴措手不及,但是问法再多,却万变不离其宗,掌握好内容的本质,才是最重要的。今天小树懒来给大家总结了两道最近被问到的MySQL面试题,如果有更好的理解,可以留言补充哦。

一、MySQL查询字段是否要区分大小写? 

答案是不区分的

那么该如何解决需要区分英文大小写的场景

1.设置“COLLATE”属性值为“utf8_bin”或者“utf8_gerneral_cs”,utf8_bin表示二进制比较,同时也支持区分大小写;在Mysql5.6.10版本中,不支持utf8_genral_cs;

2.在创建表的时候,指定表字段COLLATE 为utf8_bin或者utf8_general_cs(注意版本),如:

alter table sample modify column module varchar(128) COLLATE utf8_bin ;

3.修改字段为BINARY:

alter table sample modify column module varchar(128) BINARY;

4.查询语句字段前面加BINARY:

select * from sample where BINARY module=’SAMPLE’;

二、MySQL innodb的事务与日志的实现方式

Innodb主要有四种日志类型,简单介绍如下:

1.错误日志:记录出错信息,也记录一些警告信息或者正确的信息

2.慢查询日志:设置一个阈值,将运行时间超过该值的所有SQL语句都记录到慢查询的日志文件中

3.二进制日志:记录对数据库执行更改的所有操作

4.查询日志:记录所有对数据库请求的信息,不论这些请求是否得到了正确的执行

四种事务的隔离级别分别是读未提交(RU)、读已提交(RC)、可重复读(RR)、串行(这点在之前的文章中已讲过)

事务通过日志实现的基本流程

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

2.当事务需要回滚时,因为有 undo,可以把数据页回滚到前镜像的状态。

3.崩溃恢复时,如果 redo log 中事务没有对应的 commit 记录,那么需要用 undo 把该事务的修改回滚到事务开始之前。如果有 commit 记录,就用 redo 前滚到该事务完成时并提交掉。

Undo log是InnoDB MVCC事务特性的重要组成部分

1.事务的原子性是通过 undo log 来实现的

2.事务的持久性性是通过 redo log 来实现的

3.事务的隔离性是通过 (读写锁+MVCC)来实现的