逻辑架构
典型的CS架构,服务端程序使用的是mysqld
客户端进程向服务器进程发送一段文本(SQL语句),服务器进程处理后再向客户端进程发送文本(处理结果)
# 应用连接层:
# 连接处理,用户鉴权(username,host,password),连接到server后,根据用户的权限来判断用户可执行哪些操作,安全管理
# mysql服务层:
# [SQL接口]:接收用户的SQL命令,进行处理,将结果返回给用户
# [SQL解析器]:解析查询语句,形成语法树
# [优化器]:对查询语句进行优化,并选择合适的访问路径,生成SQL语句的执行计划
# [缓存]:全局和引擎特定的缓存,以键值对的方式缓存查询结果
# 因为sql语句要完全一样,命中率低,且对于更新频繁的表,缓存的有效期也很短,所以在mysql8中删去了缓存
# 存储引擎层
show engines;
buffer和cache
# A buffer is something that has yet to be "written" to disk.
# A cache is something that has been “read” from the disk and stored for later use.
profiling工具
# 启用profiling工具
# 通过该工具可以获取一条SQL语句在执行过程中多种资源的消耗情况
select @@profiling;
set profiling = 1;
select @@profiling;
# 展示sql执行的资源消耗和时长
select * from employees;
show profiles; # 最近几条sql语句的执行时长
show profile; # 上一条sql语句各个执行阶段的时长
show profile for query 62; # 指定sql的各个执行阶段的时长
show profile cpu,block io for query 134; # 时长,CPU和IO相关的资源消耗数据
数据库缓冲池
InnoDB存储引擎是以页(16KB)为单位来管理存储空间的
磁盘IO消耗的时间多,将磁盘中的页缓存到内存的Buffer Pool中
InnoDB存储引擎在处理客户端的请求时,当需要访问某个页的数据时,会把完整的页的数据加载到内存中
将来有请求再次访问该页时,就可以省去磁盘IO了
优先对使用频次高的数据进行加载(页面置换算法LRU)
InnoDB缓冲池中包括了数据页,索引页,插入缓存,自适应索引Hash,数据字典信息,锁信息等
当对数据库中记录进行修改时,会首先修改缓冲池中页里面的记录信息,然后数据库会以一定的频率刷新到磁盘上
缓冲池会采用一种checkpoint的机制将数据回写到磁盘上
当缓冲池不够用时,需要释放掉一些不常用的页,此时可以强行采用checkpoint的方式,将不常用的脏页回写到磁盘上,
然后再从缓冲池中将这些页释放掉,脏页指的是缓冲池中被修改过的页,与磁盘上的数据页不一致
# 查看\设置缓冲池的大小
# MYISAM引擎只缓存索引,不缓存数据,对应的键缓存参数为key_buffer_size
# INNODB引擎通过innodb_buffer_pool_size变量查看缓冲池大小
# 单位是byte
show variables like 'innodb_buffer_pool_size';
select 134217728/1024/1024; # 128MB
set global innodb_buffer_pool_size = 268435456; # 256MB
# Buffer Pool本质是Innodb申请的一块连续内存空间
# 多线程环境下,访问Buffer Pool中的数据需要加锁处理
# 在Buffer Pool特别大而且多线程并发访问特别高的情况下
# 单一的Buffer Pool可能会影响请求的处理速度
# 所以当Buffer Pool特别大时,可以把他们拆分成若干个小的Buffer Pool
# 每个Buffer Pool都称为一个实例,他们都是独立的申请内存空间,独立管理各种链表
# 在多线程并发访问时不会相互影响,提高并发处理能力
show variables like 'innodb_buffer_pool_instances';
# 当innodb_buffer_pool_size小于1G时,设置多个实例是无效的
# 在配置文件中指定
[server]
innodb_buffer_pool_instances = 2;