数据库分享一: MySQL的Innodb缓存相关优化
的最大区别就在于 Innodb 不仅仅缓存索引,同时还会缓存实 际的数据。所以,完全相同的数据库,使用 Innodb
存储引擎可以使用更多的内存来缓存数据库相关的信 息,当然前提是要有足够的物理内存。这对于在现在这个内存价格不断降低的时代,无疑是个很吸引人
的特性。
参数用来设置 Innodb 最主要的 Buffer(Innodb_Buffer_Pool)的大小,也
就是缓存用户表及索引数据的最主要缓存空间,对 Innodb 整体性能影响也最大。无论是 MySQL 官方手册 还是网络上很多人所分享的
Innodb 优化建议,都简单的建议将 Innodb 的 Buffer Pool 设置为整个系统 物理内存的 50% ~ 80%
之间。如此轻率的给出此类建议,我个人觉得实在是有些不妥。
的关系。完全相同的设置,不同的场景下的 表现可能相差很大。就从 Innodb 的 Buffer Pool
到底该设置多大这个问题来看,我们首先需要确定的是 这台主机是不是就只提供 MySQL 服务?MySQL 需要提供的的最大连接数是多少?MySQL
中是否还有 MyISAM 等其他存储引擎提供服务?如果有,其他存储引擎所需要使用的 Cache 需要多大?
* (1MB + 1MB + 1MB + 512KB + 512KB),组成大概如下:sort_buffer_size:1MB
join_buffer_size:1MB read_buffer_size:1MB read_rnd_buffer_size:512KB
thread_statck:512KB
50%~80%的建议来设置,最小也是 4GB,而通过上面的估算,最大可用值 在 3.7GB
左右,那么很可能在系统负载很高当线程独享内存差不多出现极限情况的时候,系统很可能就
会出现内存不足的问题了。而且上面还仅仅只是列出了一些使用内存较大的地方,如果进一步细化,很
可能可用内存会更少。上面只是一个简单的示例分析,实际情况并不一定是这样的,这里只是希望大家了解,在设置一些
参数的时候,千万不要想当然,一定要详细的分析可能出现的情况,然后再通过不断测试调整来达到自
己所处环境的最优配置。就我个人而言,正式环境上线之初,我一般都会采取相对保守的参数配置策
略。上线之后,再根据实际情况和收集到的各种性能数据进行针对性的调整。
pages,还有 1978 是 Free 状态的仅仅只有 70 个 page 有数据, read 请求 329 次,其中有 19
次所请求的数据在 buffer pool 中没有,也就是说有 19 次是通过读取物理 磁盘来读取数据的,所以很容易也就得出了 Innodb
Buffer Pool 的 Read 命中率大概在为:(329 - 19)/ 329 * 100% =
94.22%。
中,还有一个非常重要的概念,叫做“预读”。一般来说,预读概念主要是
在一些高端存储上面才会有,简单来说就是通过分析数据请求的特点来自动判断出客户在请求当前数据
块之后可能会继续请求的数据快。通过该自动判断之后,存储引擎可能就会一次将当前请求的数据库和
后面可能请求的下一个(或者几个)数据库一次全部读出,以期望通过这种方式减少磁盘 IO 次数提高 IO
性能。在上面列出的状态参数中就有两个专门针对预读:
Log Buffer 大小的,系统默认值为 1MB。Log Buffer 的主要作用就是缓冲 Log 数据,提高写 Log 的 IO
性能。一般来说,如果你的系统不是写负载非常高且以 大事务居多的话,8MB 以内的大小就完全足够了。
本身来说,自然是大一些会减少更多的磁盘 IO。但是由于 Log 本身是 为了保护数据安全而产生的,而 Log 从 Buffer
到磁盘的刷新频率和控制数据安全一致的事务直接相关,
并且也有相关参数来控制(innodb_flush_log_at_trx_commit),所以关于 Log 相关的更详细的实现机
制和优化在后面的“事务优化”中再做更详细的分析,这里就不展开了。
所设置的是用于存放 Innodb 的字典信息和其他一些内部结构所 需要的内存空间。所以我们的 Innodb
表越多,所需要的空间自然也就越大,系统默认值仅有 1MB。当 然,如果 Innodb
实际运行过程中出现了实际需要的内存比设置值更大的时候,Innodb 也会继续通过 OS 来申请内存空间,并且会在 MySQL
的错误日志中记录一条相应的警告信息让我们知晓。
Innodb 表的 MySQL,如果不是每个表都是上百个字段的 话,20MB
内存已经足够了。当然,如果你有足够多的内存,完全可以继续增大这个值的设置。实际上,
innodb_additional_mem_pool_size 参数对系统整体性能并无太大的影响,所以只要能存放需要的数据即
可,设置超过实际所需的内存并没有太大意义,只是浪费内存而已。
在将数据同步到数据文件进行持久化之前,首先会将需要同步的内容写入存在于表空间中的系统保留的存储空间,也就是被我们称之为 Double Write
Buffer 的地方,然后再将数据进 行文件同步。所以实质上,Double Write Buffer
中就是存放了一份需要同步到文件中数据的一个备份, 以便在遇到系统 Crash
或者主机断电的时候,能够校验最后一次文件同步是否准确的完成了,如果未完
成,则可以通过这个备份来继续完成工作,保证数据的正确性。
量了吗?这样不是可能会影响系统的性能么?这个完全不用 太担心,因为 Double Write Buffer 是一块连续的磁盘空间,所有写入
Double Write Buffer 的操作都是 连续的顺序写入操作,与整个同步过程相比,这点 IO
消耗所占的比例是非常小的。为了保证数据的准确 性,这样一点点性能损失是完全可以接受的。
Write 这样的机制来保证数据的安全准确性,比如当 我们使用某些特别文件系统的时候,如在 Solaris 平台上非常著名的 ZFS
文件系统,他就可以自己保证文 件写入的完整性。而且在我们的 Slave 端,也可以禁用 Double Write 机制。
中,实现了一个自动监测各表索引的变化情况的机制,然后通过一系列的算法来判定如果 存在一个 Hash Index
是否会对索引搜索带来性能改善。如果 Innodb 认为可以通过 Hash Index 来提高检 索效率,他就会在内部自己建立一个基于某个
B-Tree 索引的 Hash Index,而且会根据该 B-Tree 索引的 变化自行调整,这就是我们常说的 Adaptive Hash
Index。当然,Innodb
并不一定会将整个 B-Tree 索引 完全的转换为 Hash Index,可能仅仅只是取用该 B-Tree 索引键一定长度的前缀来构造一个
Hash Index。
并不会进行持久化存放在磁盘上面,仅仅存在于 Buffer Pool 中。所以,在每 次 MySQL 刚启动之后是并不存在 Adaptive
Hash Index 的,只有在停工服务之后,Innodb 才会根据相应 的请求来构建。
果innodb_buffer_pool_size >=
1000MB,那么等于50000;如果innodb_buffer_pool_size >=
8MB,那么等于10000;否则,等于1000(这种计算方法适用于Linux/Unix系统,Windows有另外一种计算OS_THREADS的方
法)。
innodb_log_buffer_size + innodb_additional_mem_pool_size + 812 / 16384 *
innodb_buffer_pool_size + OS_THREADS * 368
innodb_buffer_pool_size=1500M,innodb_additional_mem_pool_size =
20M,innodb_log_buffer_size = 8M,那么InnoDB将会分配的内存大小为1500M + 20M + 8M +
1500/20M + 17.5M,也就是1620.5M。
数据库分享一: MySQL的Innodb缓存相关优化的更多相关文章
- MySQL的Innodb缓存相关优化
MySQL的Innodb缓存相关优化 INNODB 状态的部分解释 通过 命令 SHOW STATUS LIKE 'Innodb_buffer_pool_%' 查看 Innodb缓存使用率 (I ...
- mysql的innodb缓存使用率统计
show 方式去查看: show status like '%innodb_buffer_pool_pages%'; 计算方式: (total-free)/total * %100: sql方式查看: ...
- MySQL MyISAM/InnoDB高并发优化经验
最近做的一个应用,功能要求非常简单,就是 key/value 形式的存储,简单的 INSERT/SELECT,没有任何复杂查询,唯一的问题是量非常大,如果目前投入使用,初期的单表 insert 频率约 ...
- MySQL的InnoDB索引原理详解
摘要 本篇介绍下Mysql的InnoDB索引相关知识,从各种树到索引原理到存储的细节. InnoDB是Mysql的默认存储引擎(Mysql5.5.5之前是MyISAM,文档).本着高效学习的目的,本篇 ...
- MySQL的InnoDB索引原理详解 (转)
摘要: 本篇介绍下Mysql的InnoDB索引相关知识,从各种树到索引原理到存储的细节. InnoDB是Mysql的默认存储引擎(Mysql5.5.5之前是MyISAM,文档).本着高效学习的目的,本 ...
- 剖析Mysql的InnoDB索引
摘要: 本篇介绍下Mysql的InnoDB索引相关知识,从各种树到索引原理到存储的细节. InnoDB是Mysql的默认存储引擎(Mysql5.5.5之前是MyISAM,文档).本着高效学习的目的,本 ...
- 浅谈mysql innodb缓存策略
浅谈mysql innodb缓存策略: The InnoDB Buffer Pool Innodb 持有一个存储区域叫做buffer pool是为了在内存中缓存数据和索引,知道innodb buffe ...
- 重新学习MySQL数据库2:『浅入浅出』MySQL 和 InnoDB
重新学习Mysql数据库2:『浅入浅出』MySQL 和 InnoDB 作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 sqlite 还是工程上使用非常广泛的 MySQL.P ...
- MySQL 数据库性能优化之缓存参数优化
在平时被问及最多的问题就是关于 MySQL 数据库性能优化方面的问题,所以最近打算写一个MySQL数据库性能优化方面的系列文章,希望对初中级 MySQL DBA 以及其他对 MySQL 性能优化感兴趣 ...
随机推荐
- 揭开Faiss的面纱 探究Facebook相似性搜索工具的原理
https://www.leiphone.com/news/201703/84gDbSOgJcxiC3DW.html 本月初雷锋网报道,Facebook 开源了 AI 相似性搜索工具 Faiss.而在 ...
- 一款纯css实现的垂直时间线效果
今天给大家分享一款纯css实现的垂直时间线效果.垂直时间线适合放在类似任务时间安排的网页上.该实现采用了蓝色作为主题色,界面效果还不错.一起看下效果图: 实现的代码. html代码: ... 阅读原文 ...
- 基于Mongodb进行分布式数据存储
http://blog.csdn.net/daizhj/article/details/5868360 注:本文是研究Mongodb分布式数据存储的副产品,通过本文的相关步骤可以将一个大表中的数据分布 ...
- 关于LayoutInflater的错误用法
转自:http://www.doubleencore.com/2013/05/layout-inflation-as-intended/ Layout inflation is the term us ...
- 如何安装Tomcat
1 请确认已经安装了JRE或JDK并配置好了环境变量,关于如何配置环境变量,参考我的另一篇文章"WIN7如何配置java环境变量,运行环境.doc" 2 用记事本打开bin目录下的 ...
- AVL树的实现例程
/* AVL树的节点声明 */ #ifndef _AVLTREE_H #define _AVLTREE_H struct AvlNode; typedef struct AvlNode *Positi ...
- git的color configura
git color的配置 Git多颜色输出 Git默认的输出是单一颜色的,不仅不够美观,也不容易阅读.实际上,Git本身就支持用多种颜色来显示其输出的信息,只需在命令行中运行以下命令来修改git的设置 ...
- [Python]项目打包:5步将py文件打包成exe文件 简介
1.下载pyinstaller并解压(可以去官网下载最新版): http://nchc.dl.sourceforge.net/project/pyinstaller/2.0/pyinstaller-2 ...
- gdb 读取elf
在make file中找到ld,然后将其换成 gdb, 如本例中LINKER = /usr/cygnus/xscale-020523/H-sparc-sun-solaris2.5/bin/xscale ...
- CSS3动画效果之Transform
无意中翻看博客发现这个属性,就顺便熟悉了一下,百度了一下和查看了CSS3帮助文档,特整理一下 Transform 适应于对任一DOM元素的2D或3D转换,转换效果有:旋转.拉伸.平移.倾斜等. 目前浏 ...