两万字 MySQL 保姆级面试教程,收藏细看!

点击上方"数据与人", 右上角选择“设为星标”

分享干货,共同成长!



今天给大家分享MySQL常考的面试题,看看你们能答对多少。

目录大纲:

事务的四大特性?

事务特性ACID:原子性(Atomicity
)、一致性(Consistency
)、隔离性(Isolation
)、持久性(Durability
)。具体含义:
  • 原子性(atomicity
    )
    一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作。
  • 一致性(consistency
    )
    数据库总是从一个一致性的状态转换到另外一个一致性的状态。如:拿转账来说,假设用户A和用户B两者的钱加起来一共是1000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是1000,这就是事务的一致性。
  • 隔离性(isolation
    )
    隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
    即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。
  • 持久性(durability
    )
    一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失。持久性是个有点模糊的概念,因为实际上持久性也分很多不同的级别。有些持久性策略能够提供非常强的安全保障,而有些则未必。而且「不可能有能做到100%的持久性保证的策略」否则还需要备份做什么。
  • 幻读的重点在于新增或者删除:在同一事务中,同样的条件,第一次和第二次读出来的「记录数不一样」。(因为中间有其他事务提交了插入/删除)。
  • 通过索引列对数据进行排序,降低数据排序的成本,降低了CPU
    的消耗;
  • 实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也是要占用空间的。
  • 频繁作为查询条件的字段应该创建索引;
  • 查询中与其它表关联的字段,外键关系建立索引;
  • 单键/组合索引的选择问题, 组合索引性价比更高;
  • 查询中排序的字段,如order by
    create_time
    ,排序字段若通过索引去访问将大大提高排序速度;
  • 查询中统计或者分组字段;
  • 数据类型中出现隐式转换时不会用到索引

  • 复合索引的情况下,查询条件不满足最左原则不会用到索引

  • 用or分隔的条件,如果or前条件中的列有索引,而后面的列没有索引,那么涉及的索引都不会被用到(前面的索引也不会用到)。

  • 如果Mysql估计使用索引比全表扫描更慢,则不使用索引。

  • 哈希索引不支持范围查找。
  • 哈希索引不支持模糊查询及多列索引的最左前缀匹配。
  • 因为哈希表中会存在哈希冲突,所以哈希索引的性能是不稳定的,而B+树索引的性能是相对稳定的,每次查询都是从根节点到叶子节点。
  • 尽量使用短索引,对于较长的字符串进行索引时应该指定一个较短的前缀长度,因为较小的索引涉及到的磁盘I/O
    较少,查询速度更快。
  • 索引不是越多越好,每个索引都需要额外的物理空间,维护也需要花费时间。
  • 利用最左前缀原则。
  • 不支持部分索引匹配查找,因为哈希索引是使用索引列的全部内容来计算哈希值的。
  • 只支持等值比较,不支持范围查询。
  • 当出现哈希冲突时,存储引擎需要遍历链表中所有的行指针,逐行进行比较,直到找到符合条件的行。
  • DB_ROLL_PRT
    :回滚指针,指向当前行记录的上一个版本,通过这个指针将数据的多个版本连接在一起构成undo log
    版本链。
  • DB_ROLL_ID
    :主键,如果数据表没有主键,InnoDB会自动生成主键。
  • 当前读:读取的是最新版本。UPDATE、DELETE、INSERT、SELECT … LOCK IN SHARE MODE、SELECT … FOR UPDATE
    是当前读。
  • 在当前读情况下,MySQL通过next-key
    来避免幻读(加行锁和间隙锁来实现的)。
  • where
    在数据分组前进行过滤,having
    在数据分组后进行过滤。
  • db:数据库名称
  • user:数据库用户
  • host:数据库实例的IP
  • command:当前执行的命令,比如Sleep
    Query
    Connect
  • time:消耗时间,单位秒
  • state:执行状态,主要有以下状态:
  • Locked
    ,线程正在等待锁
  • Sending data
    ,正在处理SELECT
    查询的记录,同时把结果发送给客户端
  • Kill
    ,正在执行kill
    语句,杀死指定线程
  • Connect
    ,一个从节点连上了主节点
  • Quit
    ,线程正在退出
  • Sorting for group
    ,正在为GROUP BY
    做排序
  • Sorting for order
    ,正在为ORDER BY
    做排序