浅谈mysql innodb缓存策略
浅谈mysql innodb缓存策略:
The InnoDB Buffer Pool
Innodb 持有一个存储区域叫做buffer pool是为了在内存中缓存数据和索引,知道innodb bufferpool怎么工作,和利用它读取频繁访问的数据,是mysql优化重要的方面。
理想状况下,把bufferpool的大小调整到足够大,留下足够的内存空间给其他该服务器上的进程(使其无缺页即可)。bufferpool越大,innodb 月表现为内存型数据库,从硬盘上一次读取数据,之后并成了从内存中读取数据。buffer pool甚至缓存那些因为insert,update操作而改变的数据(insert buffer),所以随机磁盘写可以聚集在一块得到更好的性能。
innodb 把缓存池作为链式管理,利用LRU(least recently used)算法,当添加新block到pool中时(无空间),innodb 替换(驱逐)一个最近最少使用的block,然后把新的block添加到链表的中间,"midpoint insertion strategy"策略把链表看出两条子链。
1:在链表的头部,是由一些“NEW”(or "young")block 组成的最近刚被访问的子链;
2:在链表的尾部,是由一些'old' block组成的最近没被访问(或者最少被访问的)的子链;
该算法使大量查询 blocks 保持在 new sublist. old sublist 持有最少使用的 blocks;这些blocks将成为替换或驱逐的候选者。
1:3/8 的buffer pool 的大小分配给old sublist
2: 链表的 midpoint (中间插入点) 是new sublist 尾部和 old sublist头部聚合的地方
3:当 innodb 读取一个block进 buffer pool时,插入到midpoint(old sublist 的头部),block被读取发生在 客户端操作,eg: sql查询,或者innodb特性 readahead(预读);
4:当访问在old sublist中一个 block时,使其变成'young',把它移动到 buffer pool的头部(new sublist的头部),如果该block 被读取是因为客户端sql查询,则第一次访问立即发生,并且该block变成'young'。如果该block被读取是因为read ahead,第一次呗访问不会发生,并且有可能在该Block被替换之前根本不能发生);
5:随着数据库操作,在buffer pool 中的没被访问的blocks(年纪大的)被移动到链表的尾部.在old sublist中的blocks 比插入在midpoint上的block老,最终,一个Block一段长时间未被使用会到达old sublist的尾部会被替换。
默认情况下,被读取的blocks会立即移动到 NEW sublist 的 head,同时意味着他们待着buffer pool中很长一段时间。当扫表时(eg, mysqldump 操作,或者 没有where语句的select操作 )可以使大量的blocks push into buffer pool中,并且驱逐大量的older 数据,即使那些所谓刚加入的 new blocks 不会再次被访问,相同的,read ahead 后台线程一次载入大量的blocks ,这些情况使经常被访问的blocks push into 到 old sublist中,然后它们成为被驱逐的候选者。
一些innodb 系统变量控制着buffer pool的大小和使你调整LRU算法
1:innodb buffer pool size
指明Buffer pool的大小,如果你的buffer pool 空间小,并且有充足的空间,使pool大点可以减小磁盘IO的次数来提高性能;
2: innodb buffer pool instances : 分成多个独立的区域,各个区域相同,来减少在并发内存读写操作的竞争;
3:innodb old blocks pct:默认3/8;
4: innodb old blocks time: 指定多长时间以毫秒为单位(ms),block插入到老子列表必须呆在那里第一次访问后多久,才能搬到新的子列表(解决预读时,缓存污染问题);
检查查询缓存是否存在于你的MySQL服务器:
mysql> show variables like 'have_query_cache';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| have_query_cache | YES |
+------------------+-------+
1 row in set (0.00 sec)
监控查询缓存的性能,使用显示状态查看缓存状态变量:
mysql> show status like 'qcache%';
+-------------------------+----------+
| Variable_name | Value |
+-------------------------+----------+
| Qcache_free_blocks | 1 |
| Qcache_free_memory | 16768376 |
| Qcache_hits | 0 |
| Qcache_inserts | 0 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 227 |
| Qcache_queries_in_cache | 0 |
| Qcache_total_blocks | 1 |
+-------------------------+----------+
8 rows in set (0.00 sec)
mysql> select count(*) from animals;
+----------+
| count(*) |
+----------+
| 6 |
+----------+
1 row in set (0.00 sec) --Qcache_hits表示sql查询在缓存中命中的累计次数,是累加值。
mysql> SHOW STATUS LIKE 'Qcache_hits';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Qcache_hits | 0 | --0次
+---------------+-------+
8 rows in set (0.00 sec) mysql> select count(*) from animals;
+----------+
| count(*) |
+----------+
| 6 |
+----------+
1 row in set (0.00 sec) mysql> SHOW STATUS LIKE 'Qcache%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Qcache_hits | 1 | --表示sql在缓存中直接得到结果,不需要再去解析
+---------------+-------+
8 rows in set (0.00 sec) mysql> select count(*) from animals;
+----------+
| count(*) |
+----------+
| 6 |
+----------+
1 row in set (0.00 sec) mysql> select count(*) from animals;
+----------+
| count(*) |
+----------+
| 6 |
+----------+
1 row in set (0.00 sec) mysql> SHOW STATUS LIKE 'Qcache_hits';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Qcache_hits | 3 | --上面的sql也是是从缓存中直接取到结果
+---------------+-------+
1 row in set (0.00 sec) mysql> insert into animals select 9,'testsds' ; --插入数据后,跟这个表所有相关的sql缓存就会被清空掉
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0 mysql> select count(*) from animals;
+----------+
| count(*) |
+----------+
| 7 |
+----------+
1 row in set (0.00 sec) mysql> SHOW STATUS LIKE 'Qcache_hits';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Qcache_hits | 3 | --还是等于3,说明上一条sql是没有直接从缓存中直接得到的
+---------------+-------+
1 row in set (0.00 sec) mysql> select count(*) from animals;
+----------+
| count(*) |
+----------+
| 7 |
+----------+
1 row in set (0.00 sec) mysql> SHOW STATUS LIKE 'Qcache_hits';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Qcache_hits | 4 |
+---------------+-------+
1 row in set (0.00 sec)
浅谈mysql innodb缓存策略的更多相关文章
- 浅谈mysql配置优化和sql语句优化【转】
做优化,我在这里引用淘宝系统分析师蒋江伟的一句话:只有勇于承担,才能让人有勇气,有承担自己的错误的勇气.有承担错误的勇气,就有去做事得勇气.无论做什么事,只要是对的,就要去做,勇敢去做.出了错误,承担 ...
- 浅谈mysql主从复制的高可用解决方案
1.熟悉几个组件(部分摘自网络)1.1.drbd —— DRBD(Distributed Replicated Block Device),DRBD号称是 "网络 RAID" ...
- 浅谈Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景
浅谈Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景 Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景 一.相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁 ...
- 浅谈MySQL中优化sql语句查询常用的30种方法 - 转载
浅谈MySQL中优化sql语句查询常用的30种方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使 ...
- 浅谈MySQL存储引擎-InnoDB&MyISAM
存储引擎在MySQL的逻辑架构中位于第三层,负责MySQL中的数据的存储和提取.MySQL存储引擎有很多,不同的存储引擎保存数据和索引的方式是不同的.每一种存储引擎都有它的优势和劣势,本文只讨论最常见 ...
- 重新学习MySQL数据库6:浅谈MySQL的中事务与锁
『浅入深出』MySQL 中事务的实现 在关系型数据库中,事务的重要性不言而喻,只要对数据库稍有了解的人都知道事务具有 ACID 四个基本属性,而我们不知道的可能就是数据库是如何实现这四个属性的:在这篇 ...
- (转)运维角度浅谈MySQL数据库优化
转自:http://lizhenliang.blog.51cto.com/7876557/1657465 一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架 ...
- 运维角度浅谈MySQL数据库优化(转)
一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分 ...
- 从运维角度浅谈 MySQL 数据库优化
一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分 ...
随机推荐
- PCoA主坐标分析
来源:http://blog.sina.com.cn/s/blog_670445240101nlss.html 1 背景介绍 这是一种排序方法.假设我们对N个样方有了衡量它们之间差异即距离的数据, ...
- Xp根据数据库insert获取微信聊天记录
https://mp.weixin.qq.com/s?__biz=MzIzNDA3MDgwNA==&mid=2649230245&idx=1&sn=3746423a481976 ...
- phpstorm+wamp+xdebug配置php调试环境
本篇文章主要是:教大家如果搭建一套phpstorm+wamp+xdebug调试php的环境现在大多数的程序员使用的调试方式一般都是echo, var_dump, file_put_contents等其 ...
- 在ssh框架中service,action,jsp,formbeam,dao的调用顺序
本文来自:http://blog.csdn.net/w_basketboy24/article/details/8642846 jsp发起请求. actionform封装请求参数. action接受请 ...
- TurnipBit开发板掷骰子小游戏DIY教程实例
转载请以链接形式注明文章来源(MicroPythonQQ技术交流群:157816561,公众号:MicroPython玩家汇) 0x00前言 下面带大家用TurnipBit开发板实现一个简单的小游戏- ...
- 实战开发-》融云tp3.2.3
1.先去下载sdk 2.我放在的位置如下: 3.之前试了试,怎么引入都不成功,所以我加入了命名空间 还有,我把methods下的所有类都加了命名空间,心里安慰吧. 4.在公共函数写函数,例如 填写自己 ...
- 第九章:Python の 网络编程基础(一)
本課主題 何为TCP/IP协议 初认识什么是网络编程 网络编程中的 "粘包" 自定义 MySocket 类 本周作业 何为TCP/IP 协议 TCP/IP协议是主机接入互网以及接入 ...
- left join,right join,inner join
数据库中left join,right join,inner join的差异 具体详细说明 总的来说: JOIN: ...
- SAP Cloud for Customer(C4C)和微信集成系列教程
这个系列主要从技术层面阐述了如何实现end user在微信app里发送的message能够投递到C4C系统,以及在C4C系统基于微信发送过来的message回复之后,如何将这些回复再push回微信ap ...
- CAD 二次开发 -- 自动加载开发的DLL
CAD二次开发可以采用写扩展DLL的方式实现.该DLL的函数可以被CAD调用. 但是调用前,必须用命令netload 将该dll加载到CAD. 其实可以修改注册表,当CAD软件启动后,自动加载扩展DL ...