Undo日志--mysql详解(十)
上篇文章说了redo日志是为了保证持久化,提高效率而产生的的,buffer pool有一个inndb buffer poll size来控制大小,并且默认128m,大于一个1g可以设置多个,但是每次同步持久化是随机I.O,redo log也有日志池,把随机io优化为顺序io,并且占用的地方小。
Redo日志--mysql详解(九)
上篇文章说了,刷新数据是通过页为单位,不可能每次查询都从磁盘查询,于是有了buffer pool,通过free,flush来刷新到磁盘,系统正常关闭,系统空闲,内存不足时候刷新。lru链表为了提高缓存命中率来刷新页到磁盘。后面介绍了acid,原子性代表在一个事务里要么全部成功要么全部失败,一致性官方文档解释是除了数据库的主键唯一建等约束外,还有业务的约束保证一直性,新增和扣减必须一致。
Buffer pool--mysql详解(八)
Mysql在访问数据的时候,并不是每次从磁盘的系统表空间查询,而是会缓存到内存,这个内存我们就称为buffer pool,可以通过innoDB buffer pool size来设置,默认是128m。 Buffer pool如何管理内存里的页呢,于是有一些表空间编号,页号,缓存页,lsn值等。
执行计划--mysql详解(七)
上篇文章说了,mysql优化器会从cpu和io成本来考虑查询的消耗,possible key来计算全表和索引的成本,选择成本最小的,子查询有物化和semi-join半连接的方式优化,物化会优先哈希索引memory存储引擎,如果数据量太大会选择b+树。
Mysql优化器-mysql详解(六)
上篇文章说了,mysql的访问效率有几大类别,const,ref,Ref_null,rang,index,all,以及连接查询走索引,驱动表和被驱动表的查询效率。
连接查询-mysql详解(五)
上篇文章说了,mysql5.6.6版本之前数据默认在系统表空间,之后默认在独立表空间,innodb因为索引和数据在一个b+树,所以两个文件,一个文件结构,一个存数据,myISAM则是三个文件。一个聚簇索引有两个段,叶子段和非叶子段,一个段有他专属的区,数据刚开始存在碎片区,不属于任何段,直属表空间。
系统表空间-mysql详解(四)
上篇文章说了,索引的b+树,聚簇索引 和 二级索引,以及如何使用索引,索引对空间和时间的影响,所以索引并不是越多越好。
索引-mysql详解(三)
上篇文章说了,mysql可以指定行格式,compact,dynamic,他结构有变长字段长度列表,null值,头部和真实数据存储,compact真实数据会存一定量的页,后面指向页的页码,dynamic全部存的页码,char会根据字符集来变换存储,行溢出是65535个字节,其中null值占一个,数据长度占两个,所以实际65532个字节,也会根据不同字节来变换。Index页存储这标记是否删除,删除的数据会组成垃圾链表,也叫可重用链表,而页里的数据,会根据next_Records来组成链表方便查询,二分查找法查找不同组的槽点。
InnoDB & index页-mysql详解(二)
上篇文章说了,mysql有character_Set_client,character_set_collection,character_Set_result来编码解码字符集。字符集有ascii、iso8859、gb2312、gbk、utf-8等。字符集和比较级的介绍。
Mysql字符集-Mysql进阶(一)
计算机上可以运行多个程序,比如QQ,微信,idea,每个程序就是一个进程(PID),mysql服务器和客户端本质就是一个进程,进程都有唯一id,简称PID。
Mysql锁&事务隔离级别—mysql进阶(七十)
Mysql隔离级别默认是repeatable read,他是不可以解决不可重复读,不可重复读是用mysql里面的mvcc解决,mvcc全称是mulit-version Concurrent Controller多版本并发控制,里面有个版本链readView。
Mysql行锁、表锁 (2)—mysql进阶(六十九)
前面说了解决并发事务访问有两种解决办法,一种用mvcc的版本链解决,读 的时候用版本链readView控制,写的时候加锁。一种是读写都加锁,比如只允许读取后数据的银行业务。锁又分为共享锁(s锁)和排它锁(x锁),锁的颗粒度分为表锁和行锁,所以当向上表的排他锁的时候,必须里面的行没有上x锁或者s锁,当然不是遍历所有行,于是在上行锁的时候,会有一个is和ix的锁,代表当前表上了行锁。
Mysql锁共享锁排它锁 (1)—mysql进阶(六十八)
前面说了为了解决脏读,幻读,不可重复读,mysql设置了四种隔离级别,read committed和read uncommitted会发生幻读和不可重复读,repeatable read会发生不可重复读,seriliztable,mysql默认是repeatable read,用mvcc解决不可重复读。设置隔离级别set global|session transaction isolation l
事务隔离级别与MVCC (1)—mysql进阶(六十七)
前面我们说了undo日志写入undo页面链表时,先需要把undo page header、undo segment header、undo log header等。每个事务都会有相应的undo链表,如果只存储一点数据不是很浪费吗,于是有了可重用,满足当前链表只有一个页,并且小于总空间的3/4。还介绍了回滚段,默认128个回滚段,每个段有1024个undo slot,每个slot分配给不同的事务,对
重用的undo日志 (3)—mysql进阶(六十六)
前面说了undo日志的文件格式,页和后面的页是不同的,填入undo日志之前,会先把undo_page_header属性填满,还有undo_segment_header,undo_log_header。List base node存在undo segment header,list node存在每个undo 页面的undo_page_header。
不重用的undo日志 (2)—mysql进阶(六十五)
前面我们说了undo日志在insert,update,delete存储的日志格式,delete存储的type是trx_undo_del_mark_rec里面有个参数old roll_pointer会指向insert的地址值,恢复需要的数据。Select是没有undo日志的,因为select不需要回滚事务。
undo日志insert,update,delete (1)—mysql进阶(六十四)
前面说了redo日志为了保证系统宕机的情况下,能够恢复数据,恢复数据是在以checkpoint_lsn为起始位子来恢复,在该值之前的都是已经持久化到磁盘的,可以为了提升效率而放弃,而之后的数据,也可能在checkpoint之后,被后台异步运行的线程刷新到磁盘,这时候如果file header里file_page_lsn值大于checkpoint_lsn值,代表已经持久化,也可以跳过。还有会吧同一个
Redo日志 (5)—mysql进阶(六十三)
前面说了lsn值就是log sequence number代表记录redo日志存了多少字节,默认值是8000多,算偏移量直接减一下就好,还有flush_to_disk的lsn值,这个值之前的数据代表都已经持久化,这个持久化代表redo日志持久化,但是对应的buffer pool数据还不能覆盖,这时候又checkpoint lsn值,这个值之前的数据都代表已经持久化完毕,是可以覆盖的。因为redo日志存储有限,存满之后,又会从个文件循环存储。可以用show engine innoDB status查看。
Redo日志 (5)—mysql进阶(六十三)
前面说了lsn值就是log sequence number代表记录redo日志存了多少字节,默认值是8000多,算偏移量直接减一下就好,还有flush_to_disk的lsn值,这个值之前的数据代表都已经持久化,这个持久化代表redo日志持久化,但是对应的buffer pool数据还不能覆盖,这时候又checkpoint lsn值,这个值之前的数据都代表已经持久化完毕,是可以覆盖的。因为redo日志存储有限,存满之后,又会从第一个文件循环存储。可以用show engine innoDB status查看。
Redo日志 (4)—log sequence number(六十二)
前面说了redo日志的格式,刷新到磁盘后台有线程每秒运行一次,还有事务提交的时候,buffer pool不会刷新到磁盘,但是log buffer会刷新到磁盘。Log buffer会分成若干的block,吧这些block持久化到磁盘上,mysql根目录有两个log_file0和log_file1,可以增加,当存满的时候,从0循环继续存储,默认是48Mb。每个block是512个字节,前面四个block占比2048个字节是记录管理信息,2048字节后面开始记录block。