本文介绍Mysql相关知识,主要包括Mysql的基础架构、事务、索引和日志等知识。
基础架构
基础架构示意图:
- 连接器:管理连接,权限验证
- 查询缓存:命中则直接返回结果
- 分析器:词法分析,语法分析
- 优化器:执行计划生成,索引选择
- 执行器:操作引擎,返回结果
- 存储引擎:存储数据,提供读写接口
Mysql可以分为Server层和存储引擎层,不同的存储引擎公用一个Server层,常见的存储引擎有InnoDB、MyISAM、Memory等,现在Mysql主要使用InnoDB做存储引擎。
大多数情况下不要使用查询缓存,因为查询缓存失效非常频繁,只要对一个表有更新,这个表上的所有存储查询缓存都会被清空。
日志
redo log:当有一条记录需要更新时,InnoDB引擎会先把记录写到redo log,并更新内存,这个时候更新就算完成了。同时,InnoDB引擎会在适当的时候,将这个操作记录更新到磁盘里面,而这个更新往往是在系统比较空闲的时候。
redo log这种机制可以保证即使数据库发生异常重启,之前提交的记录也不会丢失,这个称为crash-safe。
redo log是InnoDB存储引擎特有的日志,而Server层也有自己的日志,称为bin log。
bin log:MySQL的Server层实现的,所有引擎都可以使用。binlog是逻辑日志,记录的是这个语句的原始逻辑,比如“给ID=2这一行的c字段加1 ”。
两种日志的不同:
- redo log是InnoDB引擎特有的;binlog是MySQL的Server层实现的,所有引擎都可以使用。
- redo log是物理日志,记录的是“在某个数据页上做了什么修改”;binlog是逻辑日志,记录的是这个语句的原始逻辑,比如“给ID=2这一行的c字段加1 ”。
- redo log是循环写的,空间固定会用完;binlog是可以追加写入的。“追加写”是指binlog文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。
两阶段提交: 如果不使用“两阶段提交”,那么数据库的状态就有可能和用它的日志恢复出来的库的状态不一致。
索引
索引是为了提高查询效率,实现索引的方式有很多种:
- 哈希表
- 有序数组
- 搜索树
哈希表:适用于只有等值查询的场景,区间查询会搜索整个哈希表
有序数组:等值查询和区间查询场景中的性能都很优秀,但插入和删除数据需要移动后面的记录,代价太大。只适用于静态存储引擎。
搜索树:使用N叉树,减小树高,提高查询效率。
InnoDB中,表是根据主键顺序以索引形式存放的,这种存储方式称为索引组织表,使用了B+树索引模型。
主键索引的叶子节点存的是整行的数据(聚簇索引),非主键索引的叶子节点内容是主键的值(二级索引)
使用非主键索引的查询需要多扫描一颗索引树,称为回表,因此尽量使用主键查询。
一个数据页满了,按照B+Tree算法,新增加一个数据页,叫做页分裂,会导致性能下降。空间利用率降低大概50%。当相邻的两个数据页利用率很低的时候会做数据页合并,合并的过程是分裂过程的逆过程。
索引覆盖:可以直接提供查询结果,不需要回表,索引已经“覆盖了”查询需求。 索引覆盖可以减少树的搜索次数,提升查询性能。
最左前缀:B+树这种索引结构,可以利用索引的“最左前缀”,来定位记录。
索引下推:可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。
「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付