数据库及分布式事务

存储引擎

常用的引擎有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+树索引可以进行范围查询嘛,比如大于小于;

你可能感兴趣的:(数据库,分布式)