启停:
重启:systemctl restart mysqld.service 停止:systemctl stop mysqld.service 查看状态:systemctl status mysqld.service
mysql的内部模块:
上面是查询的逻辑,一条更新语句是如何查询的
更新语句的基本流程和查询前面是一致的,区别在于,更新语句,拿到了符合条件数据之后的操作是怎么进行处理的?
下面介绍一下基本概念:
mysql 内存结构:
mysql内存主要结构:buffer pool、change buffer、Log Buffer 、adaptive Hash Index
1、缓冲池 buffer pool
Innodb的数据上面我们也介绍了,数据是存在磁盘的idb文件中,交互时速度必然是比较慢的。这时就需要将数据加载到内存中。
innodb逻辑上的最小单位是页(16k),那么每次加载的页到内存的区域(预读),就是buffer pool。下一次取数据(数据页或者索引页)时,会优先判断在不在buffer页中。修改时,会修改内存中的数据,当buffer pool中数据和磁盘不一致时,这时就叫脏页。会有工作线程会定时同步,这个操作就叫刷脏
满了怎么办?默认大小是128M LRU的淘汰策略(简单来说就是链表,有头和尾,并且划分年轻代和老年代,以解决预读和扫表产生的问题)
mysql的LRU算法:
普通的LRU:
- 新数据插入到链表头部;
- 每当缓存命中(即缓存数据被访问),则将数据移到链表头部;
- 当链表满的时候,将链表尾部的数据丢弃。
mysql改进的LRU:
- buffer pool 分为了young(5/8)和old(5/3)两个部分
- 数据会在用户的sql用到了页中的数据,或者mysql猜测你很可能会用到的数据-预读,这两种情况加载到buffer pool
- 数据优先进入old,old满了会移出队列尾部。young区呢? 用户sql使用的页,会被移入young(且需要在old中待满配置的秒数)。而预读的数据,没被使用则会一直在old区,直到被清除
问题: 当一次大表扫描,会导致大量数进入young?
解决:mysql防止一次扫描数据过大,替换了大量热数据,有参数控制 innodb_old_blocks_time(需要在old区待满多少秒,且再被用户sql调用时,才会进入young)。
2、change Buffer