mysql实战45讲

1. 第一讲-mysql的基本架构图

在这里插入图片描述
连接器-查询缓存(key-value的形式,key是sql语句,value是返回结果集)-分析器,但是mysql8.0之后已经删除了缓存这个功能,

2. 第二讲-日志模块

执行更新操作,日志模块的运行
redolog(重做日志)
InnoDB引擎特有
固定大小,满了会把数据就更新到磁盘然后清空部分
先写日志,并更新内存,等系统空闲时候在更新到磁盘
保证数据库发送异常重启,之前提交的记录都不会丢失,这叫carsh-safe
物理日志,记录的是“在某个数据页上做了什么修改”

binlog(归档日志)
mysql的Server层,所有引擎都可以使用
追加写,写到一定大小就换一个继续写
逻辑日志,有两种模式,statement 格式的话是记sql语句, row格式会记录行的内容,记两条,更新前和更新后都有

3.第三讲-事务隔离

1、MySQL中,事务支持是在引擎层实现的

2、多事务同时执行的时候,可能会出现的问题:脏读、不可重复读、幻读

3、事务隔离级别包括:读未提交(read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(serializable )

4、不同事务隔离级别的区别:
读未提交是指,一个事务还没提交时,它做的变更就能被别的事务看到。
读提交是指,一个事务提交之后,它做的变更才会被其他事务看到。
可重复读是指,一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。
串行化,顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行

5、事务隔离级别在数据库的实现是通过创建视图,访问以视图的逻辑结果为准。
在“可重复读”隔离级别下,这个视图是在事务启动时创建的,整个事务存在期间都用这个视图。在“读提交”隔离级别下,这个视图是在每个SQL语句开始执行的时候创建的,也就是本事务内,每执行一个sql都会拿当前最新的视图。这里需要注意的是,“读未提交”隔离级别下直接返回记录上的最新值,没有视图概念;而“串行化”隔离级别下直接用加锁的方式来避免并行访问。

6、Mysql默认的事务隔离级别是可重复读(Repeatable Read),但是在互联网项目中一般用读已提交(Read Commited)这个隔离级别!

7、事务隔离的实现,MySQL中,实际上每条记录在更新的时候都会同时记录一条回滚日志.
系统会判断,当没有事务再需要用到这些回滚日志时,回滚日志会被删除。

8、长事务意味着系统里面会存在很老的事务视图。由于这些事务随时可能访问数据库里面的任何数据,所以这个事务提交之前,数据库里面它可能用到的回滚记录都必须保留,这就会导致大量占用存储空间。

9、事务启动方式:一、显式启动事务语句,begin或者start transaction,提交commit,回滚rollback;二、set autocommit=0,该命令会把这个线程的自动提交关掉。这样只要执行一个select语句,事务就启动,并不会自动提交,直到主动执行commit或rollback或断开连接。

10、建议使用方法一,如果考虑多一次交互问题,可以使用commit work and chain语法。在autocommit=1的情况下用begin显式启动事务,如果执行commit则提交事务。如果执行commit work and chain则提交事务并自动启动下一个事务。

4. 第四讲-索引

索引的出现其实就是为了提高数据查询的效率,就像书的目录一样

索引的常见模型
哈希表
键-值(key-value)存储数据的结构,key是数组,value是链表
通过hash函数对key进行计算得到一个明确的位置,把value放到链表中,之所以使用链表是因为方便追加
因为链表无序,做区间查询的时候需要全部扫描一遍,所以适用于只有等值查询的场景

有序数组
使用二分法
在等值查询和范围查询场景中的性能就都非常优秀
有序数组索引只适用于静态存储引擎,比如你要保存的是2017年某个城市的所有人口信息,这类不会再修改的数据
如果仅仅看查询效率,有序数组就是最好的数据结构了。但是,在需要更新数据的时候就麻烦了,你往中间插入一个记录就必须得挪动后面所有的记录,成本太高。

搜索树
二叉搜索树:每个节点的左儿子小于父节点,父节点又小于右儿子
二叉搜索树:查询时间复杂度O(log(N)),更新时间复杂度O(log(N))
数据库存储大多不适用二叉树,因为树高过高,会适用N叉树

InnoDB 的索引模型
在InnoDB中,表都是根据主键顺序以索引的形式存放的,这种存储方式的表称为索引组织表。InnoDB使用了B+树索引模型,所以数据都是存储在B+树中的。每一个索引在InnoDB里面对应一棵B+树。

主键索引的叶子节点存的是整行数据。在InnoDB里,主键索引也被称为聚簇索引(clustered index)。
非主键索引的叶子节点内容是主键的值。在InnoDB里,非主键索引也被称为二级索引(secondary index)。
基于非主键索引的查询,先搜索本索引树,再搜索主键索引树一次,这个叫回表,也就是说,基于非主键索引的查询需要多扫描一棵索引树。因此,我们在应用中应该尽量使用主键查询。

索引维护
主键长度越小,普通索引的叶子节点就越小,普通索引占用的空间也就越小
从性能和存储空间方面考量,自增主键往往是更合理的选择

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值