本文已参与「新人创作礼」活动,一起开启掘金创作之路。
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、硬件的优化。