数据库常见面试题(干货)

106 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

7.1.1 InnoDB 与 MyISAM 存储引擎区别

InnoDB 支持事务。InnoDB 的趋势会是一个非常复杂的存储引擎,对于一些小的应用会比 MyISAM 还慢,但是支持“行锁”,所以在写操作比较多的时候会比较优秀。并且,它支持很多的高级应用,例如:事物。Mysql5.5版本后,InnoDB为默认引擎。

MyISAM 不支持事务。MyISAM 适用于一些大量查询的应用,但对于有大量写功能的应用不是很好。甚至你只需要update 一个字段整个表都会被锁起来。而别的进程就算是读操作也不行要等到当前 update 操作完成之后才能继续进行。另外,MyISAM 对于 select count(*)这类操作是超级快的。系统崩溃后,MyISAM恢复起来更困难。

7.1.2 MySQL 索引失效的情况

索引列不独立。 使用了左模糊。 使用 or 查询部分字段没有使用索引。 字符串条件没有使用 ''。 不符合最左前缀原则的查询。 索引字段没有添加 not null 约束。 隐式转换导致索引失效。

7.1.3 乐观锁、悲观锁

乐观锁、悲观锁,理解成一种思想。

乐观锁: 比较适用于读多写少的情况(多读场景),悲观锁比较适用于写多读少的情况(多写场景),乐观锁是数据库一个表version字段来控制。

悲观锁: 是数据库层的锁,行锁,表锁。能防止任何应用层操作。

7.1.4 事务隔离级别

SQL 标准定义了四个隔离级别

READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。

READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。

REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。

SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。

隔离级别脏读不可重复读幻影读
读取未提交
读取已提交×
可重复读××
序列化×××

7.1.5 MySQL 中有哪几种锁

[表级锁]  开销小, 加锁快; 不会出现死锁; 锁定粒度大, 发生锁冲突的概率最高, 并发度最低。

[行级锁]  开销大, 加锁慢; 会出现死锁; 锁定粒度最小, 发生锁冲突的概率最低, 并发度也最高。

[页面锁]  开销和加锁时间界于表锁和行锁之间; 会出现死锁; 锁定粒度界于表锁和行锁之间, 并发度一般。

7.1.6 可以使用多少列创建索引

任何标准表最多可以创建 16 个索引列。

7.1.7 实践中如何优化 MySQL

最好是按照以下顺序优化:

1、SQL 语句及索引的优化。

2、数据库表结构的优化。

3、系统配置的优化。

4、硬件的优化。