聚集索引/非聚集索引
三大范式
- 所有的列不可分
- 每一列都和主键相关
- 每一列都和主键直接相关,不能间接相关
实际使用中为了提高查下效率,有时候也会适当的冗余一些数据,空间换时间。
存储引擎 MyISAM和InnoDB的区别
查下mysql的所有引擎 show ENGINES innodb是mysql5.6之后的默认引擎,MyISAM是5.6之前的默认引擎。
区别:
- MyISAM不支持事务,不支持行级锁,不支持外键,会保存行数,查询快,但是增删慢,适合大量查询的场景。
- InnoDB支持事务,支持行级锁,适合执行大量insert和update的表。
SQL优化
SQL优化主要就是索引优化,尽量是sql使用到索引
- 添加索引
- 联合索引的时候,使用最左前缀法则,不是指sql的顺序,而是sql中需要有索引中顺序的字段。
- 索引列不要做任何的操作
- 尽量使用覆盖索引,能减少回表
- like将%放在后面
- 字符串类型不加单引号会导致索引失效
- or改union
索引失效的场景
聚集索引和非聚集索引
聚集索引一般就是主键索引,如果没有主键,mysql会自己生成一列主键,一个表一定会有一个聚集索引。非聚集索引就是主键之外的索引,也叫辅助索引。
索引B+树
MyISAM和InnoDB索引都使用的是B+树的结构
B+树:非叶子节点只存储索引信息,叶子节点会冗余非叶子节点的数据,还会存在指向真实数据的指针,并且还会保存相邻的叶子节点之间的双向指针。
B树:非叶子节点和叶子节点都会都会保存索引的数据和真实数据的指针
为什么使用B+树不使用B树
- B+树非叶子节点不存数据,跟小,可以容纳更多的数据。
- B+树每次查询的路径大致相同跟稳定,B树可能在叶子节点就直接查询到了。
- B+树叶子节点间有双向指针,更适合范围查询。
事务特性和隔离级别
事务特性
- A 原子性
- C 一致性 保证数据的完整性
- I 隔离性
- D 持久性
事务隔离级别
事务会带来的问题:
- 脏读: 一个事务中会读取到其它事务之间的数据。
- 不可重复读: 一个事务多次读取的数据不一致。
- 幻读: 一个事务中查询莫一类数据的时候结果不一致,如其它线程插入了新的数据。
- 读未提交,存在脏读的问题
- 读已提交,其它事务中没有提交的数据无法读取,解决了脏读的问题。
- 可重复读,一次事务中查询的同一个数据不会改变,解决了不可重复读。mysql中默认的隔离级别。
- 串行化,事务之间串行处理,级别最高,并发最差。
MVCC
事务读已提交和可重复读是基于MVCC实现的,
数据库锁
数据库日志
redoLog: 保证数据的持久性,主要作用是用于数据库的崩溃恢复,存在单独的日志文件。
undoLog: 记录数据的逻辑变化,用作事务回滚,存在于表空间的数据文件中。