-
事务的极大特性是啥,mysql是的事务原理是啥
ACID:
原子性(atomicity): 一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚
一致性(consistency): 数据库总是从一个一致性的状态转换到另一个一致性的状态
隔离性(isolation): 一个事务所做的修改在最终提交以前,对其他事务是不可见的
持久性(durability): 一旦事务提交,则其所做的修改会永久保存到数据库实现原理:
原子性、一致性、持久性通过数据库的redo log和undo log来完成。
redo: 在错误处理时,对已提交的事务进行重做
undo: 用于对事务的影响进行撤销
隔离性的实现:
锁: 共享锁(Shared)和互斥锁(Exclusive)
时间戳:类乐观锁,参考PostgreSQL的实现
多版本和快照隔离:通过维护多个版本的数据,数据库可以允许事务在数据被其他事务更新时对旧版本的数据进行读取MVCC: 通过保存数据在某个时间点的快照来实现。根据事务的开始时间不同,同一时刻,不同事务对同一张表看到的数据可能是不同的。 其中,InnoDB是在每行记录保存了两个隐藏的字段,行的创建时间和行的删除时间(过期时间);其存储的是系统版本号,每开始一个事务,都会分配一个系统版本号,版本号是递增的。
-
mysql有哪些事务隔离级别,各事物级别是为了解决什么问题
读未提交(Read Uncommitted): 解决数据丢失的问题(因为写了事物日志并持久化了)读已提交(Read Committed): 解决了脏读的问题
脏读:A读取了B事物未提交的修改,然后B回滚了,则A读取到的是脏数据
可重复读(Repeatable Read): 解决了不可重复读的问题
不可重复读:A事物中先读取了数据D=a,然后B事物修改数据D=d并提交了,此时A再次读取数据D,发现D=d而不是之前的D=a,此为不可重复读
可重复读: 一个事务在执行过程中可以看到其他事务已经提交的新插入的记录(读已经提交的,其实是读早于本事务开始且已经提交的),但是不能看到其他事务对已有记录的更新(即晚于本事务开始的),并且,该事务不要求与其他事务是“可串行化”的。
实现原理: 通过mvcc的方式处理该问题。串行化(Serializable): 隐式地将全部的查询语句加上共享锁,解决了幻读的问题
幻读: 事物A先根据某条件获取到一批数据d1,d2,d3;然后事物B删除掉了数据d2;此时事物A再次根据同样的条件查询,却只获取到了数据d1,d3。 发现d2不见了。此为幻读
原理: 通过引入间隙锁处理该问题 -
mysql有哪些引擎,各自有何特点
MyISAM: 不支持事务和行级锁,且崩溃后数据无法安全恢复。该引擎一般适用于允许数据崩溃且不需要支持事务的情况,比如说一主多从的时候,从mysql服务器就可以使用该引擎。InnoDB: MySQL的默认事务引擎,采用了MVCC来支持高并发,并实现了四个标准的事务级别。其默认事务级别为Repeatable Read,并且通过间隙锁策略防止缓读的出现。间隙锁使得InnoDB不仅仅锁定查询涉及到的行,还会对索引中的间隙进行锁定,防止幻影行的插入。
InnoDB使用聚簇索引,其二级索引必须包含主键列。所以设计的时候,主键最好不要太大。 -
mysql的innodb引擎的索引是什么数据结构,为何要那么设计
索引的作用:- 索引大大减少了服务器需要扫描的数据量
- 索引可以帮助服务器避免排序和临时表
- 索引可以将随机I/O变为顺序I/O
MySQL中innodb引擎的索引结构:B+树
至于为什么选择B+树,以及B树和B+树的区别等,参考文章:B树和B+树的总结
mysql的最左原则正是因为索引使用的是B+树结构。对于复合索引,在比较存储节点的时候,是按照复合索引中的列来依次排序的,所以查找的时候也是按照这个规则来。 -
mysql索引实效的情况有哪些
- 使用了null判断
- 未遵循最左索引规则
- 查询条件中使用了函数
- like全匹配
- …
-
mysql主从同步如何实现的
mysql 主从复制原理 -
如何进行mysql的优化
单条语句的慢查询:
一般通过explain命令查看sql语句的执行计划,看其中比较重要的几个字段数据: 查询类型,使用到的索引,扫描的行数。一般就是根据这几个数据就能调整大多数的慢查询sql了。间歇性问题诊断:
SHOW GLOBAL STATUS
高频率执行,查看系统的一些运行相关的计数器,通过找到一些尖刺数据来发现问题(eg. 每秒的查询数,当前的连接数,当前的查询线程数等)
SHOW PROCESSLIST
高频率执行,捕获输出来查看是否有大量线程处于不正常的状态。
更多sql优化和mysql server优化可以去好好看《高性能MySQL(第3版)》 -
MySQL分区
MySQL分区
推荐阅读《高性能MySQL(第3版)》