事务四大特性
原子性(undo log)
隔离性(MVCC和Next-Key)
一致性(原子性 隔离性 持久性)
持久性(redo log: 体积小, 顺序io)
隔离级别
读未提交
读已提交
可重复读(与MySQL标准不同, 使用了Next-Key 锁算法 , 可以避免幻读)
可串行化
不同隔离级别下数据读取常见问题
脏读:读到未提交的数据
不可重复读:一个事务中多次读一个数据的结果不一致
幻读:一个事务中数据行数不一致(可以通过MVCC快照或者Next-Key当前读解决:原理:将当前数据行与上一条数据和下一条数据之间的间隙锁定,保证此范围内读取的数据是一致的。)
MySQL有几种日志
binlog:MySQL sever 层维护的一种二进制日志,记录了所有的 DDL 和 DML 语句,除了数据查询语句 select、show 等,还包含语句所执行的消耗时间。binlog主要用来进行主从同步。有三种格式:statement(记录语句) row(记录每一行的改动) mixed(混合)
rodo log:每当有操作执行前,在数据真正更改前,会先把相关操作写入 redo 日志。这样当断电,或者发生一些意外,导致后续任务无法完成时,待系统恢复后,可以继续完成这些更改。
undo log:撤销日志。用来在事务提交失败时回滚
MVCC怎么实现的
多版本并发控制机制,是MySQL的InnoDB存储引擎实现隔离级别的一种具体方式。本质是一种乐观锁
隐藏列transaction_id和roll_ptr 快照存在undo日志中
只关注小于transaction_id的数据
roll_ptr把一个数据行所有的快照连在一起
事务提交时如果修改的数据同时也修改了,就回滚到开始执行事务之前的状态
MySQL怎么做主从复制
什么是聚集索引?什么是非聚集索引?聚集索引和非聚集索引区别
聚集索引是表的内容按照索引的顺序排列, 叶子结点都是数据.
非聚集索引的叶子结点是索引
聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致。
MySQL的存储引擎有哪些,有什么区别
InnoDB和Mylsam
区别:
InnoDB | MyISAM |
支持事务 | 不支持事务 |
不记录行数,每次查询需要遍历 | 记录行数 |
支持行锁和间隙锁 | 只支持行锁 |
索引和数据在一起 | 索引和数据分开 |
支持外键 | 不支持外键 |
MySQL有哪些索引
联合索引
覆盖索引:MySQL可以使用多个字段同时建立一个索引,叫做联合索引.在联合索引中,如果想要命中索引,需要按照建立索引时的字段顺序挨个使用,否则无法命中索引.
全文索引
SQL优化方式有哪些
建立索引, 尽量使用索引
对索引优化,尽量避免全表查询
选择正确的存储引擎
垂直分表
数据库结构优化
范式优化(减少数据冗余)
反范式优化(减少join)
读写分离
拆分表
限定数据范围
MySQL的锁
表锁
表共享读锁 表独占写锁
行锁
间隙锁
乐观锁
悲观锁
MySQL索引的底层数据结构怎么选择
hash表查询快,但是在进行范围查询时不理想
B树进行范围查询时会回表,而且搜索时间不稳定,每一个结点所能存的数据不稳定
B+树只有叶子结点存数据,叶子节点还用指针连成链表。非叶子节点能存更多索引
所以选择B+树