面试-mysql常见问题

1.mysql的MVCC机制是什么?

MVCC 就是多版本并发版本控制器,是Mysql 解决读写冲突的解决方案。通过往表上增加两到三个隐藏字段,undo日志及ReadView 实现。
我们可以通过两种组合解决并发冲突
MVCC+ 悲观锁方式:MVCC解决读写冲突,悲观锁解决写写冲突
MVCC+乐观锁方式:MVCC解决读写冲突,乐观锁解决写写冲突

原理:

三个隐藏字段:
(DB_TRX_ID) 记录这条记录最后一次修改的事务ID
(DB_ROLL_PTR)回滚指针,指向这条记录的上一个版本
(DB_ROW_ID)自增主键,如果没有设置主键,就会产生这个字段作为隐藏主键

undo 日志分为两种:

insert undo log:插入日志
update undo log:修改日志

read view 读视图

事务在进行快照读的时候产生的读视图,在事务执行快照读的时候,会生成数据库当前的一个快照,并为这个事务分配一个ID,ID是自增的,最新的事务ID 一定是最大的。readview 读视图上记录了事务列表中
最小的事务ID,
下一个要分配的新事务ID,
当前活跃的事务ID列表(活跃事务就是操作了还没提交的事务)。

当并发产生读写时,判断下读视图上最小的事务ID是否小于表记录上的事务ID(DB_TRX_ID),如果是小于的,说明这个事务是在修改之后产生的,那么这条记录就可以被这个读视图查询到,如果不小于,就要判断这个表上的事务ID(DB_TRX_ID) 是否大于等于下一个要分配的最新事务ID,如果大于了这个新事务的ID,那么说明这个数据是不可见的,否则就判断表上记录的事务ID(DB_TRX_ID) 是否存在在活跃事务ID列表中,存在说明事务还没提交,这个数据不可被读取,不存在,说明事务已经提交,可以被读取。

当前表中记录的这行数据是不可被读取的时候,就会通过这个表的回滚指针去undo日志中找到这个记录的上一个版本放在read view 中给用户读取。

2.事务隔离级别有哪些?

  • 未提交读;
  • 提交读;
  • 重复读;
  • 串行化

3. 数据库的三大范式是什么?

  • 第一范式:字段具有原子性,不可再分(每一个列只有一个值)
  • 第二范式:行数据的唯一性,也就是主键(每一行都能区分)
  • 第三范式:要求表不包含其他表的非主键信息(每一个表都不冗余多余字段)

4.索引有哪些种类

  • 普通索引:针对数据库表建的索引
  • 唯一索引:与普通索引类似,但是必须是全表唯一,可以为空
  • 主键索引:创建主键是同时创建,全表唯一,不可为空
  • 组合索引:将表中多个字段联合在一起作为一个组合索引

5.你一般都怎么优化查询

  • select 查询时只查询需要用的字段
  • 多表查询时,避免复杂的关联查询,通过单表查询再in 另外的表
  • 为查询条件增加索引,索引也不是随便加,需要找到辨识度高的使用频次高的字段加上索引,如手机号,订单号等。
  • select 查询条件优先查询索引,减少like 等让索引失效的操作。
  • 排序优化,如果能通过有序索引进行排序是最好的,如果不能,mysql 提供了存储引擎可以再内存中进行排序:
    1.取出满足条件的需要用于排序的字段及行指针,在内存中排序好后,根据指针信息取得客户端其他字段的数据,返回给客户端(内存占用小,耗时长)
    2.一次性取出满足条件的数据,将这些数全部放到内存中,将需要排序的字段进行排序,最后将排序号的结果返回给客户端(内存占用大,耗时短)

你可能感兴趣的:(mysql,面试,数据库)