一、索引
- 索引目的:加快数据的查询效率
- 索引模型:哈希表(等值)、有序数组(等值、范围)、二叉树(树高问题)、B-树(存储成本大、不适合范围查询)、B+树(叶子结点指向)
- 索引类型:存储(聚簇、非聚簇)、字段特性(主键、唯一、普通、全文)、字段个数(单列、联合)
- 索引下推
- 创建原则:查询频繁、更新少、区分度高、长度小、最左前缀、联合索引、非空字段、离散度
- 索引失效:使用函数、联合索引未满足最左匹配原则、隐式转化、or语句前后没有同时使用索引、索引列使用不等于号或not、like通配符匹配后缀%xxx
- B+Tree原理
· B+Tree中的非叶子结点不存储数据,只存储键值;
· B+Tree的叶子结点没有指针,所有键值都会出现在叶子结点上,且key存储的键值对应data数据的物理地址;
· B+Tree的每个非叶子节点由n个键值key和n个指针point组成;
二、事物
- 概念:一组操作,要么全部成功,要么全部失败。
- ACID:原子性、一致性、隔离性、持久性
- 并发问题
问题 | 说明 | 解决方法 |
---|---|---|
脏读 | 一个事务访问到另外一个事务未提交的数据 | 行锁 |
不可重复读 | 多次读取同一条记录,得到的记录值不一致 | MVCC |
幻读 | 多次读取某范围内的记录,得到的记录条数不一致 | Next-key lock |
- 隔离级别
隔离级别 | 描述 | 实现原理 |
---|---|---|
读未提交 | 一个还没提交的事物的变更可以被别的事物看到 | |
读提交 | 一个事物提交后,别的事物才能看到该事物的变更 | 快照读+undo log |
可重复读 | 一个事物在执行过程中看到的数据,总是和事物启动时看到的一致 | 当前读+undo log |
串行化 | 对同一行记录会加读、写锁 |
三、锁
- 锁类型:粒度(行、页、表)、类别(共享、排他)
- innodb锁:Record lock、Gap lock(开区间)、Next-key lock(前开后闭区间)
- 死锁检测:直接进入等待状态,直至超时;发起死锁检测,检测到死锁后,回滚死锁链中的某个事务,让其他事务继续执行
- 乐观锁
- 悲观锁
四、MVCC
-
什么是MVCC?
MVCC全称是:Multi-Version Concurrency Control,即多版本并发控制,是一种并发控制的方法.在MySQL 的InnoDB中的实现是为了解决数据库的读-写
并发问题,提高数据库的并发性能. -
并发会有什么问题?
读-读: 并发时,没有问题
读-写: 并发时,可能会造成事务隔离性问题,导致出现脏读、幻读、不可重复读
写-写: 可能会存在更新丢失问题,比如 第一类更新丢失,第二类更新丢失 -
MVCC是怎么解决读-写并发问题的?
MVCC只是一个抽象的概念,MySQL通过3个隐式字段+undo log+Read View
等实现MVCC.
说明:
[快照读] : 即不加锁的读(如select),读取到的数据不一定是最新版本的.快照读的前提是事务的隔离级别不能是串行化,串行化的快照读会退化为当前读.
[当前读] : 读取到最新的记录数据(如select for update),读取时要保证其他的事务不能修改数据,所以会对读取的记录进行加锁. -
3个隐式字段?
[DB_TRX_ID] : 6 byte,最近修改(修改/插入)事务 ID:记录创建这条记录/最后一次修改该记录的事务 ID
[DB_ROLL_PTR] : 7 byte,回滚指针,指向这条记录的上一个版本(存储于 rollback segment 里)
[DB_ROW_ID] : 6 byte,隐含的自增 ID(隐藏主键),如果数据表没有主键,InnoDB 会自动以DB_ROW_ID产生一个聚簇索引 -
undo log
-
Read View
Read View 就是事务进行快照读操作的时候生产的读视图,在该事务执行的快照读的那一刻,会生成数据库系统当前的一个快照,记录并维护系统当前活跃事务的 ID
五、日志文件
- redo log
- bing log
- undo log
六、SQL的执行顺序
七、MySQL优化
- SQL优化
- 架构优化:字段优化、大于500万条考虑水平分库分表或根据业务含义做垂直分表、主从架构
- 缓存:JVM或Redis缓存等
- 数据量太大,考虑TiDB、elastic- search等
- 深度分页查询优化:(1)通过子查询得到主键ID,再查询其余信息,减少回表次数;(2)关联查询得到ID;(3)标签记录;(4)between…and
八、数据库连接池
A. J2EE服务器启动时会建立一定数量的池连接,并维持不少于该数量的池连接
B. 客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并标记为忙
C. 若当前没有空闲的连接,池驱动程序会新建一定数量的池连接,数量取决于配置参数
D. 当使用的池连接调用完成后,池驱动程序将连接标记为空闲,其他调用可使用该连接
E. 当连接数量达到最大值时,池驱动程序将不再创建新连接,只能等连接空闲后再使用连接.
九、基础知识
- 数据库三大范式是什么
第一范式:每个列都不可以再拆分。
第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。
第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。 - MyISAM 和 InnoDB 的区别
- 判断sql语句是否使用索引及分析一条SQL的性能瓶颈