事务。索引。sql优化。常见配置。存储引擎。mvcc。4个隔离级别。
mysql 事务
悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作
乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。
事务在启动的时候会维护一个活跃(还未提交)的事务列表,
4个特性
- 一致性
- 原子性
- 隔离性
- 持久性
4个隔离级别(由低到高)
- Read uncommitted
一个事务可以读取另一个事务未提交的内容
- Read committed
一个事务要等到另一个事务提交后才能读到
- Repeatable read
可重复读
- Serializable
系列化,事务串行化顺序执行
脏读:读取到未提交的事务
不可重复读:前后多次读取,数据内容不一致
幻读:一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次查询没看见的行(数据总总量不一致)
存储引擎
MyISAM 适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好。甚至你只是需要update一个字段,整个表都会被锁起来,而别的进程,就算是读进程都无法操作直到读操作完成。另外,MyISAM 对于 SELECT COUNT(*) 这类的计算是超快无比的。
InnoDB 的趋势会是一个非常复杂的存储引擎,对于一些小的应用,它会比 MyISAM 还慢。他是它支持“行锁” ,于是在写操作比较多的时候,会更优秀。并且,他还支持更多的高级应用,比如:事务。
索引
加速查询的数据结构。
B树 mongo的索引
B+树 mysql的索引
B+树特征
- 每一个父节点的元素都会出现在子节点中,是子节点的最大(最小)元素, 所以所有的叶子节点包括了所有元素。
- 有K个子树的中间节点包含K个元素(B树是K-1),每个元素不保存数据,只用来做索引。
- 范围查询只需要遍历底层的链表即可,B树需要做中序遍历。
sql 优化
- 对查询进行优化, 尽量避免全表扫描, 要考虑在经常查询的where 和 order by 上建立索引
- 尽量避免在 where 字句中对字段进行 null 值判断
- 尽量避免使用在 where 字句中使用 != , <> 操作符
- 尽量避免使用 or
- 尽量避免使用 in , not in
- 索引固然可以提高相应的select 效率,但同时降低了 insert 和 update 的效率,因为有时有重建索引。
常见配置
- max_connections (连接数)
- query_cache (查询缓存)
MVCC 多版本并发控制
- 加入几列隐藏字段,数据行的版本号(db_trx_id),删除版本号(db_roll_pt)
- 在读取数据的时候,会有一个版本号,提交的时候会检查一个这个版本号,如果大于当初的就允许提交,如果小于,就认为是过期数据,不允许提交。
- 解决 写写 阻塞的问题。
一致性视图:用于支持 RC 和 RR 隔离级别的实现