mysql常见面试题<一>字符集、MVCC和锁

发布于:2025-06-17 ⋅ 阅读:(16) ⋅ 点赞:(0)

一、编码字符集

  1. 常用的utf8mb3无法存储一些表情,如果想要存储表请需要使用进行utf8mb4。因为为了性能,MySQL的utf-8默认是utf8mb3,也就是最长是3个字节的编码,而不是4个字节的编码的utf8mb4。
  2. 通信过程中的字符集的设置
    a. 客户端发送的时候的编码方式:windows下default-character-set
    b. 服务端接收消息默认的编码方式:character_set_client
    c. 运行中的编码方式:character_set_connection
    d. 返回客户端的时候的编码方式:character_set_results
    e. 客户端接受道消息的时候:除了操作系统自带的字符集,还受到default_character_set影响
  3. 比较规则:
    a. 每种字符集都有自己默认的比较规则
    b. 只修改字符集,比较规则也会跟着变化,如果只修改比较规则,字符集也会随着变化
  4. 字符集和比较规则包括:服务器,数据库、表、列四个级别,每一个级别没有设置就使用上一级别的

二、MVCC

MySQL的事务隔离级别

  1. 四种隔离级别分别是什么?分别解决了什么问题?MySQL的默认隔离级别
  2. undo日志的版本链 + ReadView:
    a. Read commit和Repeatable Read生成一致性视图的时机不一致,分别什么情况下生成?
    b. ReadView包含哪些属性?
    c.undo日志的版本连包含哪些属性?
  3. purge:update的undo日志的删除
  4. MySQL的Repeatable Read隔离可以避免幻读吗?能避免什么情况下的幻读,不能避免什么情况下的幻读?

三、锁

  1. 锁退化的情况
  2. 不加锁的情况:MVCC,在可重复读的隔离级别下,进行非加锁的读语句
  3. 加锁的情况:
    a. 锁定读:序列化读 + 自动提交为0的情况;显示加锁(in share mode;for update)
    b. 更新操作
  4. 锁的类型:行锁,表锁
    a. 表锁:在没有意向锁的情况可以进行加锁;InnoDB的表锁非常的鸡肋,除了会在DDL和数据库崩溃恢复的情况下,基本都用不到;可以手动加上表锁
    b. 行锁(Gap Lock,Record Lock,Next-Key Lock):防止幻读的
  5. 锁的类型:共享锁,排他锁,意向锁
  6. 锁结构:锁类型(行锁结构/表锁结构);锁模式(共享、排他、意向锁)
  7. 加锁分析条件:
    a. 执行的SQL语句 :决定了是否需要加锁(除了一致性读之外其他的都会加锁)
    b. 事务隔离级别:决定了是否加锁,以及加什么锁
    c. 索引类型
    d. 是否是精确匹配
    e. 是否是唯一性搜索
  8. 加锁分析实例:7步
  9. 查看当前数据库事务的情况的SQL语句 information_schema.INNODB_TRX
    10.查看当前数据库死锁情况的 show engine innodb status

网站公告

今日签到

点亮在社区的每一天
去签到