MySQL总结

一、索引

  1. 索引目的:加快数据的查询效率
  2. 索引模型:哈希表(等值)、有序数组(等值、范围)、二叉树(树高问题)、B-树(存储成本大、不适合范围查询)、B+树(叶子结点指向)
  3. 索引类型:存储(聚簇、非聚簇)、字段特性(主键、唯一、普通、全文)、字段个数(单列、联合)
  4. 索引下推
  5. 创建原则:查询频繁、更新少、区分度高、长度小、最左前缀、联合索引、非空字段、离散度
  6. 索引失效:使用函数、联合索引未满足最左匹配原则、隐式转化、or语句前后没有同时使用索引、索引列使用不等于号或not、like通配符匹配后缀%xxx
  7. B+Tree原理
    · B+Tree中的非叶子结点不存储数据,只存储键值;
    · B+Tree的叶子结点没有指针,所有键值都会出现在叶子结点上,且key存储的键值对应data数据的物理地址;
    · B+Tree的每个非叶子节点由n个键值key和n个指针point组成;
    在这里插入图片描述

二、事物

  1. 概念:一组操作,要么全部成功,要么全部失败。
  2. ACID:原子性、一致性、隔离性、持久性
  3. 并发问题
问题说明解决方法
脏读一个事务访问到另外一个事务未提交的数据行锁
不可重复读多次读取同一条记录,得到的记录值不一致MVCC
幻读多次读取某范围内的记录,得到的记录条数不一致Next-key lock
  1. 隔离级别
隔离级别描述实现原理
读未提交一个还没提交的事物的变更可以被别的事物看到
读提交一个事物提交后,别的事物才能看到该事物的变更快照读+undo log
可重复读一个事物在执行过程中看到的数据,总是和事物启动时看到的一致当前读+undo log
串行化对同一行记录会加读、写锁

三、锁

  1. 锁类型:粒度(行、页、表)、类别(共享、排他)
  2. innodb锁:Record lock、Gap lock(开区间)、Next-key lock(前开后闭区间)
  3. 死锁检测:直接进入等待状态,直至超时;发起死锁检测,检测到死锁后,回滚死锁链中的某个事务,让其他事务继续执行
  4. 乐观锁
  5. 悲观锁

四、MVCC

  1. 什么是MVCC?
    MVCC全称是:Multi-Version Concurrency Control,即多版本并发控制,是一种并发控制的方法.在MySQL 的InnoDB中的实现是为了解决数据库的读-写并发问题,提高数据库的并发性能.

  2. 并发会有什么问题?
    读-读: 并发时,没有问题
    读-写: 并发时,可能会造成事务隔离性问题,导致出现脏读、幻读、不可重复读
    写-写: 可能会存在更新丢失问题,比如 第一类更新丢失,第二类更新丢失

  3. MVCC是怎么解决读-写并发问题的?
    MVCC只是一个抽象的概念,MySQL通过3个隐式字段+undo log+Read View等实现MVCC.
    说明:
    [快照读] : 即不加锁的读(如select),读取到的数据不一定是最新版本的.快照读的前提是事务的隔离级别不能是串行化,串行化的快照读会退化为当前读.
    [当前读] : 读取到最新的记录数据(如select for update),读取时要保证其他的事务不能修改数据,所以会对读取的记录进行加锁.

  4. 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产生一个聚簇索引

  5. undo log
    在这里插入图片描述

  6. Read View
    Read View 就是事务进行快照读操作的时候生产的读视图,在该事务执行的快照读的那一刻,会生成数据库系统当前的一个快照,记录并维护系统当前活跃事务的 ID


五、日志文件

  1. redo log
  2. bing log
  3. undo log

六、SQL的执行顺序

  1. 一条查询语句的执行顺序
  2. 一条更新语句的执行顺序

七、MySQL优化

  1. SQL优化
  2. 架构优化:字段优化、大于500万条考虑水平分库分表或根据业务含义做垂直分表、主从架构
  3. 缓存:JVM或Redis缓存等
  4. 数据量太大,考虑TiDB、elastic- search等
  5. 深度分页查询优化:(1)通过子查询得到主键ID,再查询其余信息,减少回表次数;(2)关联查询得到ID;(3)标签记录;(4)between…and

八、数据库连接池

A. J2EE服务器启动时会建立一定数量的池连接,并维持不少于该数量的池连接
B. 客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并标记为忙
C. 若当前没有空闲的连接,池驱动程序会新建一定数量的池连接,数量取决于配置参数
D. 当使用的池连接调用完成后,池驱动程序将连接标记为空闲,其他调用可使用该连接
E. 当连接数量达到最大值时,池驱动程序将不再创建新连接,只能等连接空闲后再使用连接.


九、基础知识

  1. 数据库三大范式是什么
    第一范式:每个列都不可以再拆分。
    第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。
    第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。
  2. MyISAM 和 InnoDB 的区别
  3. 判断sql语句是否使用索引及分析一条SQL的性能瓶颈
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值