两万字 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
做排序