现如今,面试高级测试、性能测试等岗位,面试官都喜欢问一些底层原理的问题,感觉和开发的面试越来越靠近了。
比如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后面字段是非索引字段
session2对第二条数据加排它锁,阻塞
session2插入数据,阻塞
至此,说明session1锁表了。
主键索引
session1对第一条数据加排它锁,where后面字段是主键索引字段
session2对第一条数据加排它锁,阻塞,因为是同一条数据
session2对第二条数据加排它锁,成功
session2插入数据,成功
至此,说明session1是行锁。
唯一索引
session1对第一条数据加排它锁,where后面字段是唯一索引字段
session2对第一条数据加排它锁,阻塞,因为是同一条数据
session2对第二条数据加排它锁,成功
session2对第一条数据加排它锁(where后面是主键索引字段),阻塞,因为是同一条数据
session2对第二条数据加排它锁(where后面是主键索引字段),成功
session2插入数据,成功
至此,说明session1是行锁。
结论:InnoDB的行锁是通过索引实现的,如果session1不通过索引访问数据,就会锁表;另外,不同记录的索引键最好不要一样,否则会冲突导致锁等待。
bak:https://www.cnblogs.com/uncleyong/p/13782477.html