深刻mysql (一)

执行流程

1,链接
链接管理模块,接收请求;链接进程和用户模块,经过,链接线程和客户端对接
2,查询
查询缓存 Query Cache
分析器,内建解析树,对其语法检查,先from,再on,再join,再where…;检查权限,生成新的解析树,语义检查(没有字段k在这里)等
优化器,将前面解析树转换成执行计划,并进行评估最优
执行器,获取锁,打开表,经过meta数据,获取数据
3,返回结果
返回给链接进程和用户模块,而后清理,从新等待新的请求mysql

日志系统

redo是物理的,binlog是逻辑的;如今因为redo是属于InnoDB引擎,因此必需要有binlog,由于你可使用别的引擎
保证数据库的一致性,必需要保证2份日志一致,使用的2阶段式提交;其实感受像事务,不是成功就是失败,不能让中间环节出现,也就是一个成功,一个失败
若是有一天mysql只有InnoDB引擎了,有redo来实现复制,那么感受oracle的DG就诞生了,物理的速度也将远超逻辑的,毕竟只记录了改动向量
binlog几大模式,通常采用row,由于遇到时间,从库可能会出现不一致的状况,可是row更新先后都有,会致使日志变大
最后2个参数,保证事务成功,日志必须落盘,这样,数据库crash后,就不会丢失某个事务的数据了
其次说一下,对问题的理解
备份时间周期的长短,感受有2个方便
首先,是恢复数据丢失的时间,既然须要恢复,确定是数据丢失了。若是一天一备份的话,只要找到这天的全备,加入这天某段时间的binlog来恢复,若是一周一备份,假设是周一,而你要恢复的数据是周日某个时间点,那就,须要全备+周一到周日某个时间点的所有binlog用来恢复,时间相比前者须要增长不少;看业务能忍受的程度
其次,是数据库丢失,若是一周一备份的话,须要确保整个一周的binlog都无缺无损,不然将没法恢复;而一天一备,只要保证这天的binlog都无缺无损;固然这个能够经过校验,或者冗余等技术来实现,相比之下,上面那点更重要web

一、事务的特性:原子性、一致性、隔离性、持久性
二、多事务同时执行的时候,可能会出现的问题:脏读、不可重复读、幻读
三、事务隔离级别:读未提交、读提交、可重复读、串行化
四、不一样事务隔离级别的区别:
读未提交:一个事务还未提交,它所作的变动就能够被别的事务看到
读提交:一个事务提交以后,它所作的变动才能够被别的事务看到
可重复读:一个事务执行过程当中看到的数据是一致的。未提交的更改对其余事务是不可见的
串行化:对应一个记录会加读写锁,出现冲突的时候,后访问的事务必须等前一个事务执行完成才能继续执行
五、配置方法:启动参数transaction-isolation
六、事务隔离的实现:每条记录在更新的时候都会同时记录一条回滚操做。同一条记录在系统中能够存在多个版本,这就是数据库的多版本并发控制(MVCC)。
七、回滚日志何时删除?系统会判断当没有事务须要用到这些回滚日志的时候,回滚日志会被删除。
八、何时不须要了?当系统里么有比这个回滚日志更早的read-view的时候。
九、为何尽可能不要使用长事务。长事务意味着系统里面会存在很老的事务视图,在这个事务提交以前,回滚记录都要保留,这会致使大量占用存储空间。除此以外,长事务还占用锁资源,可能会拖垮库。
十、事务启动方式:1、显式启动事务语句,begin或者start transaction,提交commit,回滚rollback;2、set autocommit=0,该命令会把这个线程的自动提交关掉。这样只要执行一个select语句,事务就启动,并不会自动提交,直到主动执行commit或rollback或断开链接。
十一、建议使用方法一,若是考虑多一次交互问题,可使用commit work and chain语法。在autocommit=1的状况下用begin显式启动事务,若是执行commit则提交事务。若是执行commit work and chain则提交事务并自动启动下一个事务。算法

索引

1.索引的做用:提升数据查询效率
2.常见索引模型:哈希表、有序数组、搜索树
3.哈希表:键 - 值(key - value)。
4.哈希思路:把值放在数组里,用一个哈希函数把key换算成一个肯定的位置,而后把value放在数组的这个位置
5.哈希冲突的处理办法:链表
6.哈希表适用场景:只有等值查询的场景
7.有序数组:按顺序存储。查询用二分法就能够快速查询,时间复杂度是:O(log(N))
8.有序数组查询效率高,更新效率低
9.有序数组的适用场景:静态存储引擎。
10.二叉搜索树:每一个节点的左儿子小于父节点,父节点又小于右儿子
11.二叉搜索树:查询时间复杂度O(log(N)),更新时间复杂度O(log(N))
12.数据库存储大多不适用二叉树,由于树高太高,会适用N叉树
13.InnoDB中的索引模型:B+Tree
14.索引类型:主键索引、非主键索引
主键索引的叶子节点存的是整行的数据(聚簇索引),非主键索引的叶子节点内容是主键的值(二级索引)
15.主键索引和普通索引的区别:主键索引只要搜索ID这个B+Tree便可拿到数据。普通索引先搜索索引拿到主键值,再到主键索引树搜索一次(回表)
16.一个数据页满了,按照B+Tree算法,新增长一个数据页,叫作页分裂,会致使性能降低。空间利用率下降大概50%。当相邻的两个数据页利用率很低的时候会作数据页合并,合并的过程是分裂过程的逆过程。
17.从性能和存储空间方面考量,自增主键每每是更合理的选择。sql

回表:回到主键索引树搜索的过程,称为回表
覆盖索引:某索引已经覆盖了查询需求,称为覆盖索引,例如:select ID from T where k between 3 and 5
在引擎内部使用覆盖索引在索引K上其实读了三个记录,R3~R5(对应的索引k上的记录项),但对于MySQL的Server层来讲,它就是找引擎拿到了两条记录,所以MySQL认为扫描行数是2
最左前缀原则:B+Tree这种索引结构,能够利用索引的"最左前缀"来定位记录
只要知足最左前缀,就能够利用索引来加速检索。
最左前缀能够是联合索引的最左N个字段,也能够是字符串索引的最左M个字符
第一原则是:若是经过调整顺序,能够少维护一个索引,那么这个顺序每每就是须要优先考虑采用的。
索引下推:在MySQL5.6以前,只能从根据最左前缀查询到ID开始一个个回表。到主键索引上找出数据行,再对比字段值。
MySQL5.6引入的索引下推优化,能够在索引遍历过程当中,对索引中包含的字段先作判断,直接过滤掉不知足条件的记录,减小回表次数。数据库