赞
踩
时间局部性和空间局部性 数据和程序都有聚集成群的倾向 之前被读取过的数据有可能很快被下一次读取
如果珑需要读以一个字付a,从磁盘中,是奥的只取了一个字符吗? 内存跟磁盘在进行数据交互的时候由一个最基本的逻辑单元,称之为页,或者叫datapage,不同的操作系统页的大小是不同的,一般是4k,或者8k,每次在进行读取的时候需要读取4k的整数倍 innodb存储引擎默认读取的是16kb的数据
Mysql的架构是一个单线程,多进程的模式
查看连接:show global status like '%Threads%';
show global variables like 'wait_timeout'; (非交互式超时时间,如JDBC程序)
show global variables like 'interactive_timeout';(交互式超时时间,如数据库工具)
默认连接数量151,最大连接数量100000(V5.7)
缓存 : show variables like 'query_cache%';
不推荐开启,因为Mysql缓存很鸡肋,如果一张表里的任意一行数据发生变化,整张表的缓存都会失效,浪费资源,建议使用专业的缓存工具如Redis
show variables like 'datadir'; 查看mysql位置
Mysql数据库的引擎再5.5.5之前是My ISAM ,之后才改为InnoDB,建表时默认InnoDB
不同的数据引擎再磁盘中存储的方式也不同
首先将数据加载到Buffer Pool中,假如要对某一条数据进行修改,这个数据刚好在数据页中,就把这个数据页加载到Buffer Pool中,Buffer Pool对应的叫缓存页,每个缓存页有一个元数据信息,就是缓存页的描述信息,占用缓存页的5%(16K* 5% = 800多字节)左右资源,元数据描述信息也会占用内存,所以Buffer Pool的内存会比128M大
Buffer Pool还没有同步到磁盘中的数据叫"脏页",将脏页数据同步到磁盘文件的动作叫"刷脏"
show variables like '%innodb_buffer_pool%'; (查看Buffer Pool大小),默认128M ,企业中可能会设置到机器内存的80%
如果Buffer Pool满了 ,会有内存淘汰机制LRU
原生LRU策略:淘汰链表末尾的数据
Buffer Pool对LRU策略进行了改良,将LRU分为两块
free链表 :管理Buffer Pool的空闲区域
flush链表:记录Buffer Pool中的脏页
数据update后,当前页变为脏页,会记录到flush链表上,MySQL后台线程会定时查找flush链表并同步控制块记录的页数据到磁盘 (刷脏)
lru链表:记录Buffer Pool中有数据的页,后进来的加载链表的头部 越是靠前的控制块数据,就是最近使用的数据,(访问数据后,数据页对应的控制块会移动到lru链表的最前边) 假如Buffer Pool满了,就会淘汰lru链表尾部的控制块对应的数据页
全表扫描会替换Buffer Pool中的热数据
从存储引擎拿到数据,记录到Buffer Pool 执行一遍查询,进一步返回给Sercer
修改记录 ,这时会去内存中修改数据
调用存储引擎,记录到Buffer Pool
日志 redo log ,undo log
事务提交
主节点负责写,从节点不能被操作,从节点负责读,
通过bin log 保持主从复制
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。