- 事务正确执行的四要素ACID,原子性、一致性、隔离性和持久性;事务隔离级别是指事务内多次读取的区别,有读未提交(Read Uncommited)、读已提交(Read Commited)、可重复读(Repeatable Read)和序列化(Serializable);Mysql默认隔离级别是可重复读;
- 脏读:读到未提交的数据,如果此时数据回滚,就不正确了;
- 不可重复读:同一个事务中多次查询不一致;
- 幻读:同一个事务中多次查询条数不一致;
-
Mysql有共享锁(S锁)又称读锁和排它锁(X锁)又称写锁;共享锁只能读不能写,允许其它事务获取共享锁但不允许获取排它锁;排它锁可以读写但不允许其它事务获取任何锁;
-
MVCC,Multi-Version Concurrency Control 多版本并发控制,保证数据读不加锁,读写不冲突;读操作分为快照读和当前读,快照读读取的是记录的可见版本(有可能是历史版本),不用加锁,当前读读取的是记录的最新版本,并加锁以保证其它事务不会并发修改;参考:http://www.cnblogs.com/zhaoyl/p/4121010.html
-
2PL,Two-Phase Locking 两阶段锁(不是两阶段提交)相比一次性锁提高了并发,但会产生死锁;它是将事务分为两个阶段:第一阶段为加锁,在加锁阶段事务只能加锁,也可以操作数据,但不能解锁,第二阶段为解锁,解锁阶段只能解锁,也可以操作数据,但不能加锁;
-
GAP锁,间隙锁,算是一种共享锁,用于锁定事务执行范围内可能会插入新数据的位置,会导致死锁;
-
分页优化:
- 第一种方式是利用索引,如果查询列不是排序的,可以通过自关联索引列筛选,如:
select t1.* from buyer t1, (select id from buyer sellerid=100 limit 100000,5000) t2 where t1.id=t2.id;
- 第二种方式是增加where条件,并按id排序,前端返回最后一条数据id,把limit m,n改写为limit n,如:
SELECT * FROM system_log s WHERE s.id > 2000000 LIMIT 10;
-
关联查询优化,要求小表驱动大表;关联的字段collate排序规则要一致,否则会导致隐式转换。传入的变量与字段类型不符也会导致隐式转换,进而导致索引无法使用。
-
建立冗余索引,尽量覆盖筛选条件和显示字段,减少回表读取。
-
多个单列索引可能只会选择最优索引使用,所以尽量使用联合索引。联合索引也是B+树,非叶节点存储第一个字段的索引。
-
索引常用的有B+Tree和Hash两种数据结构,InnoDB只支持B+Tree索引,只在叶节点存储数据节省空间,并且叶节点顺序相连,适合排序与范围筛选;Hash适合查找唯一值,但Hash容易冲突,不建议使用。B+树层级少,节点小,节省存储空间,能减少IO;红黑树是二叉树,不适合数据库。https://zhuanlan.zhihu.com/p/217875063
-
InnoDB默认对主键创建聚簇索引,索引值为本条数据的数据内容,聚簇索引按数据物理顺序排序,一个表只能有一个聚簇索引;其他索引为二级索引,索引值为主键;如下图:
聚簇索引.png
网友评论