MySQL
1 数据库事务的特性(ACID)
A, atomacity 原子性 事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。
通常,与某个事务关联的操作具有共同的目标,并且是相互依赖的。如果系统只执行这些操作的一个子集,
则可能会破坏事务的总体目标。原子性消除了系统处理操作子集的可能性。
C, consistency 一致性 事务将数据库从一种一致状态转变为下一种一致状态。
也就是说,事务在完成时,必须使所有的数据都保持一致状态(各种 constraint 不被破坏)。
I, isolation 隔离性 由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。
事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,
事务不会查看中间状态的数据。换句话说,一个事务的影响在该事务提交前对其他事务都不可见。
D, durability 持久性 事务完成之后,它对于系统的影响是永久性的。该修改即使出现致命的系统故障也将一直保持。
2 脏读 幻读 不可重复读
3 事物隔离级别
1 读未提交(Read uncommitted)
就是一个事务可以读取另一个未提交事务的数据。
2 读提交(Read committed)
就是一个事务要等另一个事务提交后才能读取数据。
3 重复读(Repeatable read) 重复读是 Mysql 的默认隔离级
就是在开始读取数据(事务开启)时,不再允许修改操作
4 Serializable 序列化
最高的事务隔离级别,在该级别下,事务串行化顺序执行,
可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能
4 事物隔离的实现
1 行级锁 INNODB引擎
行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。
行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。行级锁分为共享锁 和 排他锁。
特点 开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
2 表级锁 MYISAM引擎
表级锁是MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,
被大部分MySQL引擎支持。最常使用的MYISAM与INNODB都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)。
特点 开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发度最低。
3 页级锁 BDB引擎
页级锁是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。
所以取了折衷的页级,一次锁定相邻的一组记录。
特点 开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般
5 SQL的生命周期
1 应用服务器与数据库服务器建立一个连接
2 数据库进程拿到请求sql
3 解析并生成执行计划,执行
4 读取数据到内存并进行逻辑处理
5 通过步骤一的连接,发送结果到客户端
6 关掉连接,释放资源
6 乐观锁与悲观所
1 乐观锁 每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。
乐观锁适用于读多写少的应用场景,这样可以提高吞吐量。
2 悲观锁 先获取锁,再进行业务操作,即“悲观”的认为获取锁是非常有可能失败的,因此要先确保获取锁成功再进行业务操作。
7 索引
1 主键索引: 数据列不允许重复,不允许为NULL.一个表只能有一个主键
2 唯一索引: 数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。
3 普通索引: 基本的索引类型,没有唯一性的限制,允许为NULL值。
4 全文索引: 是目前搜索引擎使用的一种关键技术。
8 最左前缀
最左优先,在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边
9 索引算法 BTree Hash
网友评论