存储引擎
常用的引擎有MyISAM, InnoDB, Memeory, Archive, Federated
MyISAM:使用B+Tree存储数据,但是索引和数据是分开存储的,叶子节点是数据文件的地址指针。不支持事务,查询速度快。不支持外键,仅支持表锁。
InnoDB: 同样B+Tree存储数据,索引和数据是绑定在一起的,树的叶子节点就是数据文件,支持外键,将由外键的InnoDB转化为MyISAM时候会报错。支持行锁和表锁,但是如果没有命中索引,也是无法使用行锁的。
InnoDB必须要有主键
InnoDB的四大特性:插入缓冲(Inert Buffer), 二次写(Double Write), 自适应哈希索引(Ahi),预读(Read Ahead)。
创建索引的原则
1、建立唯一性的索引,例如主键,不能重复。
2、经常需要排序、分组和联合操作的字段建立索引
3、限制索引的数量,使用数据量少的索引
4、当字符长度较长时,使用前缀索引:alter table test add key(name(4)); 取name字段的前四位来做索引
5、删除不用或者少用的索引
6、索引列不能参与计算,带函数的查询不建议参与索引
7、扩展现有索引,联合索引的查询效率比多个独立索引高
数据库的三范式
第一范式:每个列都是不可再分的最小单元
第二范式:再第一范式基础上,每张表只描述一件事情。
第三范式:满足一二范式基础上,表中的列不对非主键列的传递依赖。
数据库事务
原子性:事务要么是一个完成操作,要么都不执行,要么都执行。
一致性:在事务执行完毕时,数据都必须处于一致状态。
隔离性:对数据进行修改的所有并发事务彼此都是隔离的。
持久性:事务完成后,对数据的修改被持久化到永久性存储中。
数据库的分表
垂直切分:将表赞找功能模块、关系密切程度将表划分到不同的库中。
水平切分:在一张表中的数据量过大的时候,将表中的数据按照某种规则如userId散列进行划分。
分布式事务
两阶段提交协议:准备阶段,事务协调者给每个参与者发送Prepare消息,参与者在本地执行事务,但是不提交。提交阶段,协调者收到参与者发送的消息,来决定给每个参与者发送提交或者是回滚。
两阶段提交的缺点:同步阻塞问题,单点故障,数据不一致导致脑裂,协调者宕机后事务状态丢失。
三阶段提交协议:二阶段的改进版;引入了超时机制;增加询问机制:CanCommit, PreCommit, DoCommit.
传统事务的ACID。
柔性事务BASE:基本可用(Basically Available)、柔性状态(Soft State)、最终一致性(Eventual Consistency)
通常使用的柔性事务分为:两阶段型、补偿性、异步确保型、最大努力通知型。
Q&A
InnDB为什么推荐使用自增的主键?
A: 自增ID可以保证每次插入B+树都是从右边扩展的,可以避免B+树和树的频繁分裂和聚合,效率要更好。
锁机制介绍:行锁、表锁、排他锁、共享锁?
A:
乐观锁的业务场景及实现方式?
A:
MySQL的锁?
A: MySQL的自动提交使用的是乐观锁,需要使用悲观锁则使用set autocommit=0指令关闭事务的自动提交。select ... for update会锁定该数据。
事务介绍,分布式事物的理解,常见的解决方案有哪些,什么事两阶段提交、三阶段提交;
MySQL记录binlog的方式主要包括三种模式?每种模式的优缺点是什么?
MySQL锁,悲观锁、乐观锁、排它锁、共享锁、表级锁、行级锁;
分布式事务的原理2阶段提交,同步\异步\阻塞\非阻塞;
数据库事务隔离级别,MySQL默认的隔离级别、Spring如何实现事务、
JDBC如何实现事务、嵌套事务实现、分布式事务实现;
SQL的整个解析、执行过程原理、SQL行转列;
为什么不对mysql的所有表都添加索引?
Mysql索引为什么不用hash而用B+树?hash底层的时间复杂度是多少?
B+树索引可以进行范围查询嘛,比如大于小于;