一、内部结构:
mysql是一个可拔插的内部结构,包括连接池、解析器、查询优化器、缓存区(cache和buffer)、file system(redo、undo、binlog、索引等)、存储引擎。
常用的知识点:
- WAL: 写前日志包括redo和undo
- redo log : 记录事务的动作
- undo log: 记录事务的操作
- bin log: 主从数据库中记录主的日志
- relay log : 主从数据库中从数据库的日志
- 存储引擎:innodb myisam dbd memory
问题1 : select语句的执行过程:
问题2:INNODB和MYISAM的比较:
- INNODB有事务、支持外键、支持聚集索引、支持行锁、适用于安全性较高、且写操作较多的表(订单表、账号表)
- MYISAM无事务、无外键、支持非聚集索引、支持标所、查询所读快、支持批量插入、适用于读操作较多、或需要大规模插入的表(论坛表、回复表)
二、事务:
问题1 : 什么是事务、有哪些特性?
- 事务就是一组对数据操作的集合
- A 原子性:事务要么都做、要么都不做
- C 一致性:事务不影响数据库完整性(约束完整性、数据完整性)
- I 隔离性:两个事务之前互相不影响(锁+MVCC)
- D 持久性:事务修改后,进行持久化保存
其中原子性、持久性、隔离性中的MVCC由redo和undo来实现。而一致性中的数据完整性是由其他三个特征共同作用的结果,并不是依赖于某一种单独的技术。
原理:在操作事务前,先要在磁盘中写数据到buffer pool中,当此时出现断网等意外操作时,会先去redo log中寻找事务做了哪些操作,再去undo log中找到事务到底改变了什么数据,这样整个事务就完成了恢复。
问题2 : 事务的隔离级别于数据库隔离出现问题的对应关系是什么?
脏读:RU下,事务A读到了事务B未提交的数据。
不可重复度:RC下,事务A前后两次读到了同一字段不同值(UPDATE操作,值改变)事务B修改了字段值。
幻读:RR下,事务A读到前后两次读到了不同数量的同一字段(INSERT操作,数量改变)事务B插入了数据
问题3 : MVCC实现原理
事务1在修改数据前:
- 排它锁锁定事务1、记录操作到redo log
- 讲原修改行复制到 undo log 中 , 记录数据
- 增加事务号、讲回滚指针连接
- purge 线程用来扫描这次事务最早的操作,将之前的日志进行删除以保证redo log 不会无限写入
MVCC优点:读不加锁、读写分离
问题4 : 事务的开启方式:
第一种:直接开启事务
START TRANSACTION;
事务代码
commit;
第二中:关闭自动提交
set autocommit=0
事务代码
commit
三、索引及优化:
问题1 : mysql有什么索引:
以内部结构来分类
- 哈希索引:通过哈希函数计算哈希值,对应某个地址,查询速度快。但无法范围查询,切会出现哈希碰撞(解决方式为碰撞位置组成单链表)
- B+树索引:mysql的主流索引。
以索引类型来划分
- 聚集索引: innodb的索引类型,B+树的叶子节点里存的是索引和数据。对应着Innodb的表,只有表文件和索引数据文件两个。
- 非聚集索引:myisam的索引类型,B+树的