高级测试面试题(mysql篇)

现如今,面试高级测试、性能测试等岗位,面试官都喜欢问一些底层原理的问题,感觉和开发的面试越来越靠近了。

比如mysql,可能会问如下问题:

InnoDB行锁实现方式?
innodb如何解决幻读?
什么是回表?
B-树的不足?
B+树如何解决了B-树的不足?
哪些情况,创建了索引也用不上?
什么是聚集索引、索引覆盖、索引下推?
辅助索引的叶子节点为什么不存储数据的指针地址?
InnoDB、MyISAM的优缺点?
事务的隔离级别有哪些?分别解决什么问题?
MVCC的原理?
主从复制原理?

 

虽然实际工作不一定能用上,但这样确实可以看出面试者对知识的掌握程度和研究深度;本文主要演示一下之前一位微友遇到的面试题(上面第一个问题);从mysql-5.5.5开始,InnoDB就作为默认的存储引擎了,其相关的特性,可以参考官网:https://dev.mysql.com/doc/refman/5.7/en/innodb-storage-engine.html 

创建表

CREATE TABLE `employeeInfo` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `employeeId` varchar(10) DEFAULT NULL,
  `job` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_employeeId` (`employeeId`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;

  

添加数据

插入数据

insert INTO employeeInfo(name,employeeId,job) VALUES(‘全栈测试笔记0001‘,‘qzcsbj0001‘,‘dev‘);
insert INTO employeeInfo(name,employeeId,job) VALUES(‘全栈测试笔记0002‘,‘qzcsbj0002‘,‘manager‘);

  

不使用索引

说明:    

update/insert/delete默认加上排它锁,下面为了演示,手动在事务中加    

下面选中的语句即为当前执行的语句


session1对第一条数据加排它锁,where后面字段是非索引字段

高级测试面试题(mysql篇)

session2对第二条数据加排它锁,阻塞

高级测试面试题(mysql篇)

session2插入数据,阻塞

高级测试面试题(mysql篇)

至此,说明session1锁表了。

主键索引

session1对第一条数据加排它锁,where后面字段是主键索引字段

高级测试面试题(mysql篇)

session2对第一条数据加排它锁,阻塞,因为是同一条数据

高级测试面试题(mysql篇)

session2对第二条数据加排它锁,成功

高级测试面试题(mysql篇)

session2插入数据,成功

高级测试面试题(mysql篇)

至此,说明session1是行锁。

唯一索引

session1对第一条数据加排它锁,where后面字段是唯一索引字段

高级测试面试题(mysql篇)

session2对第一条数据加排它锁,阻塞,因为是同一条数据

高级测试面试题(mysql篇)

session2对第二条数据加排它锁,成功

高级测试面试题(mysql篇)

session2对第一条数据加排它锁(where后面是主键索引字段),阻塞,因为是同一条数据

高级测试面试题(mysql篇)

session2对第二条数据加排它锁(where后面是主键索引字段),成功

高级测试面试题(mysql篇)

session2插入数据,成功

高级测试面试题(mysql篇)

至此,说明session1是行锁。 

结论:InnoDB的行锁是通过索引实现的,如果session1不通过索引访问数据,就会锁表;另外,不同记录的索引键最好不要一样,否则会冲突导致锁等待。

 

 

bak:https://www.cnblogs.com/uncleyong/p/13782477.html

 

高级测试面试题(mysql篇)

上一篇:MySQL-InnoDB聚簇索引与非聚簇索引


下一篇:Web自动化学习(5)