图书管理系统(java+mssql)130226.rar,java实现的图书管理系统。
文件:590m.com/f/25127180-500471712-84933e(访问密码:551685)
以下内容无关:
-------------------------------------------分割线---------------------------------------------
客户端先通过连接器建立连接,连接器自会判断用户权限
(如果开启了查询缓存并且匹配上key就直接返回结果给客户端,不执行下面的流程)
分析器对SQL进行词法分析与语法分析,明确SQL要做什么
优化器生成执行计划,选择索引,明确怎么做
执行器通过操作存储引擎读写接口来获取或更新数据,并将执行结果返回给客户端
但是对于存储引擎内部的执行流程没有讲到。本文用一条更新语句带你了解InnoDB的内存结构和磁盘结构,限于篇幅和作者本身知识储备,或有不详尽之处,欢迎指出。
本文目的是让你知道更新过程中涉及到了哪些东西,这个东西的细节和配置就需要你自己去慢慢探索了。
限于篇幅,本文不讲解WAL机制(redo log 和 binlog),阅读此文的朋友最好对此先有所了解
更新流程图#
有点复杂,其实这个是我用来复习的,涉及到的知识点还是挺多的,欢迎取用,下面慢慢讲解下图
上面涉及到了诸多内存与磁盘,下面从InnoDB的内存结构与磁盘结构来理清上述流程。本文主要是想讲流程,对InnoDB的内存结构和磁盘结构只会简单讲解,有遗漏或错误之处还请指正。
更新流程说明#
主要讲更新过程中涉及的内存和磁盘,讲是什么和会怎么样,而为什么要这样放在本文末尾拓展知识里,这里主要先让你形成更新脉络。
第一步:更新数据#
当我们要更新 id = 2 这条数据时,会先去判断该记录是否在数据页内存中。
如果在,那么更新数据页内存,此时数据页内存中的数据和磁盘上数据不一致,我们叫他脏页
如果不在,先要判断是否是唯一索引
如果不是,那么将更新内容写入到Change Buffer中,结束
如果是唯一索引,那么将 id = 2 这条记录读入数据页内存中(干净页),然后更新数据页内存(变脏页)
数据页内存#
数据页内存是什么
数据页内存是InnoDB buffer pool的一块内存区域,存储的单位是数据页,例如id = 2 这行记录和所在的页数据。
扩展:InnoDB 的数据是按数据页为单位来读写的。也就是说,当需要读一条记录的时候,并不是将这个记录本身从磁盘读出来,而是以页为单位,将其整体读入内存。在 InnoDB 中,每个数据页的大小默认是 16KB。
为什么需要数据页内存
我们要知道缓存机制是为了解决CPU高算力和I/O读写能力的差距。这里也不例外,对于查询来说,如果记录在数据页内存中那么查询要快的多,内存读写比磁盘读写快多了,更新也是一样的道理,不管是更新到数据页内存中还是更新到Change Buffer中,都是读写内存。
Change Buffer#
Change Buffer 是什么
是InnoDB buffer pool的另一块内存区域,他和数据页内存不同的是他存储的是更新内容,例如 把id = 2的这条记录中某个列的值 从 1 改为 2。下次查询id = 2这条记录时,让磁盘中的记录(此时值为1) 执行 change buffer中的更新操作,得到列值2,这个过程叫merge,merge后的结果会放入数据页内存中。
注意这里要判断是不是唯一索引,只有非唯一索引的更新操作才可以使用change buffer。
为什么非唯一索引才能使用change buffer
对于非唯一索引,往往会有多条记录,这些记录往往是随机存储的,不在一个数据页上,假设 id = 2 有 1000条记录,分散在10个数据页上,那么就要10次I/O读,而写入Change Buffer 是内存写,所以Change Buffer对更新性能的提升是很明显的。
为了使用change buffer 提升更新性能,我们是不是可以更多的选择 普通索引 呢
innodb_change_buffer_max_size 变量允许将更改缓冲区的最大大小配置为缓冲池总大小的百分比。默认情况下, innodb_change_buffer_max_size设置为 25。最大设置为 50。
注意虽然名字叫作 change buffer,实际上它是可以持久化的数据。也就是说,change buffer 在内存中有拷贝,也会被写入到磁盘上。
change buffer的前身是insert buffer,只能对insert 操作优化;后来升级了,增加了update/delete的支持,名字也改叫change buffer.