mysql时该如何估算内存的消耗,公式如何计算?
经常有人问配置mysql时该如何估算内存的消耗。那么该使用什么公式来计算呢?
关心内存怎么使用的原因是可以理解的。如果配置mysql服务器使用太少的内存会导致性能不是最优的;如果配置了太多的内存则会导致崩溃,无法执行查询或者导致交换操作严重变慢。在现在的32位平台下,仍有可能把所有的地址空间都用完了,因此需要监视着。
话虽如此,但我并不觉得找到什么可以计算内存使用的秘诀公式就能很好地解决这个问题。原因有--如今这个公式已经很复杂了,更重要的是,通过它计算得到的值只是“理论可能”并不是真正消耗的值。事实上,有8gb内存的常规服务器经常能运行到最大的理论值--100gb甚至更高。此外,你轻易不会使用到“超额因素”--它实际上依赖于应用以及配置。一些应用可能需要理论内存的10%而有些仅需1%。
那么,我们可以做什么呢?首先,来看看那些在启动时就需要分配并且总是存在的全局缓冲--key_buffer_size,innodb_buffer_pool_size,innodb_additional_memory_pool_size,innodb_log_buffer_size,query_cache_size。如果你大量地使用myisam表,那么你也可以增加操作系统的缓存空间使得mysql也能用得着。把这些也都加到操作系统和应用程序所需的内存值之中,可能需要增加32mb甚至更多的内存给mysql服务器代码以及各种不同的小静态缓冲。这些就是你需要考虑的在mysql服务器启动时所需的内存。其他剩下的内存用于连接。例如有8gb内存的服务器,可能监听所有的服务就用了6gb的内存,剩下的2gb内存则留下来给线程使用。
和"mysql服务器内存使用"有关的数据库编程小帖士:
strong>SUBSTRB
SUBSTRB返回一字符串的指定部分。2881064151该函数与SUBSTR极为类似,只是该函数的start和length两参数均以字节为单位,而不是根据字符。这种区别只有在使用多种不同的字符集时才有意义。
每个连接到mysql服务器的线程都需要有自己的缓冲。大概需要立刻分配256k,甚至在线程空闲时--它们使用默认的线程堆栈,网络缓存等。事务开始之后,则需要增加更多的空间。运行较小的查询可能仅给指定的线程增加少量的内存消耗,然而如果对数据表做复杂的操作例如扫描、排序或者需要临时表,则需分配大约read_buffer_size,sort_buffer_size,read_rnd_buffer_size,tmp_table_size大小的内存空间。不过它们只是在需要的时候才分配,并且在那些操作做完之后就释放了。有的是立刻分配成单独的组块,例如tmp_table_size可能高达mysql所能分配给这个操作的最大内存空间了。注意,这里需要考虑的不只有一点--可能会分配多个同一种类型的缓存,例如用来处理子查询。一些特殊的查询的内存使用量可能更大--如果在myisam表上做成批的插入时需要分配bulk_insert_buffer_size大小的内存。执行alter table,optimize table,repair table命令时需要分配myisam_sort_buffer_size大小的内存。
只有简单查询oltp应用的内存消耗经常是使用默认缓冲的每个线程小于1mb,除非需要使用复杂的查询否则无需增加每个线程的缓冲大小。使用1mb的缓冲来对10行记录进行排序和用16mb的缓冲基本是一样快的(实际上16mb可能会更慢,不过这是其他方面的事了)。
另外,就是找出mysql服务器内存消耗的峰值。这很容易就能计算出操作系统所需的内存、文件缓存以及其他应用。在32位环境下,还需要考虑到32位的限制,限制“mysqld”的值大约为2.5g(实际上还要考虑到很多其他因素)。2881064151现在运行“ps aux”命令来查看vsz的值--mysql进程分配的虚拟内存。也可以查看“resident memory”的值,不过我想它可能没多大用处,因为它会由于交换而变小--这并不是你想看到的。监视着内存变化的值,就能知道是需要增加/减少当前的内存值了。
可能有的人想说,我们想要让服务器能保证100%不会耗尽内存,不管决定用什么样的查询、什么样的用户。很不幸,这其实很不明智也不可能,因为:
以下是很少考虑的mysql服务器内存需求
每个线程可能会不止一次需要分配缓冲。考虑到例如子查询--每层都需要有自己的read_buffer,sort_buffer,tmp_table_size等。
在每个连接中很多变量都可能需要重新设置。如果开发者想设定自己的变量值来运行某些查询就不能继续使用全局值。
可能有多个索引缓存。为了配合执行查询可能会创建多个索引缓存。
解析查询和优化都需要内存。这些内存通常比较小,可以忽略,不过如果是某些查询在这个步骤中则需要大量内存,尤其是那些设计的比较特别的查询。
存储过程。复杂的存储过程可能会需要大量内存。
准备查询语句以及游标。单次链接可能会有很多的准备好的语句以及游标。它们的数量最后可以限定,但是仍然会消耗大量的内存。
innodb表缓存。innnodb表有自己的缓存,它保存了从一开始访问每个表的元数据。它们从未被清除过,如果有很多innodb表的话,那么这个量就很大了。这也就意味着拥有create table权限的用户就可能把mysql服务器的内存耗尽。
老张交流QQ:2881064151
mysql时该如何估算内存的消耗,公式如何计算?的更多相关文章
- php查询mysql时,报超出内存错误(select count(distinct))时
学时服务器查询教练所带人数时,使用select count(distinct(u_STRNO))时报超出内存错误.后参考“mysqld-nt: Out of memory解决方法”http://jin ...
- 启动mysql时显示:/tmp/mysql.sock 不存在的解决方法
启动mysql时显示:/tmp/mysql.sock 不存在的解决方法 启动mysql时报错的解决(mysql 5.0.45 redhat as 43) ====================== ...
- .zip版初次安装mysql时遇到的my.ini、服务无法启动以及设置登录密码的问题
下载mysql出现的问题 若下载的是.zip版,就是免安装的直接解压就可以的出现的问题 一.需要在E:\mysql\mysql-5.7.14-winx64目录下手动添加my.ini文件(.ini文件是 ...
- 打开mysql时,提示 1040,Too many connections
打开mysql时,提示 1040,Too many connections,这样就无法打开数据库,看不了表里边的内容了. 出现这个问题的原因是,同时对数据库的连接数过大,mysql默认的最大连接数是1 ...
- 用mysql时遇到的一些问题
1 mysql5.7文件夹中没有my.ini文件 解决办法-> 如果是windows的系统下安装的,应该是在这个目录下面:C:\ProgramData\MySQL\MySQL Server 5. ...
- 启动Mysql时发生的一个关于PID文件错误问题
今天启动mysql时出现了如下错误: [root@host1 /]# service mysql start Starting MySQL.. ERROR! The server quit wit ...
- CentOS命令登录MySQL时,报错ERROR 1045 (28000):
CentOS命令登录MySQL时,报错ERROR 1045 (28000): Access denied for user root@localhost (using password: NO)错误解 ...
- hibernate导入大量数据时,为了避免内存中产生大量对象,在编码时注意什么,如何去除?
Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); for ( i ...
- jsp页面写入中文到mysql时出现了乱码(转)
今天自己在用jsp把中文写入mysql的时候出现乱码,从数据库中读取出来的时候也显示为“??”,感觉应该出现了编码转换过程中的字符信息丢失.然后在mysql中直接执行该命令,发现中文是正常的,所有认为 ...
随机推荐
- UML 序列图一点理解
激活状态,就是长方形该画到哪里呢?我的理解是,一个长方形代表调用函数的执行过程,比如下图 这个长方形就表示viewDidAppear()函数没有执行完,在这个长方形上发出或者收到的消息都是在 view ...
- hdu 1272 小希的迷宫 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272 第二条并查集,和畅通工程的解法类似.判断小希的迷宫不符合条件,即有回路.我的做法是,在合并两个集 ...
- js判断是否为正整数的正则写法 JavaScript正整数正则
判断是否为正整数 JavaScript正则判断一串数字是否为正整数, 首先要明白这几个问题 1:javascript里会把一串数字前边的0自动屏蔽,(我不知道屏蔽这个词用的是否正确) console. ...
- 【图文详解】scrapy爬虫与动态页面——爬取拉勾网职位信息(2)
上次挖了一个坑,今天终于填上了,还记得之前我们做的拉勾爬虫吗?那时我们实现了一页的爬取,今天让我们再接再厉,实现多页爬取,顺便实现职位和公司的关键词搜索功能. 之前的内容就不再介绍了,不熟悉的请一定要 ...
- iOS的I/O操作
一般而言,处理文件时都要经历以下四个步骤: 1.创建文件 2.打开文件,以便在后面的I/O操作中引用该文件 3.对打开的文件执行I/O操作(读取.写入.更新) 4.关闭文件 iOS中,对文件常见的处理 ...
- 二进制日志BINARY LOG清理
mysql> show master logs; +------------------+-----------+ | Log_name | File_size | +------------- ...
- mysql 超级管理员
mysql> grant all privileges on *.* to 'master'@'%' identified by '3306' with grant option; Query ...
- C# Window Form解决播放amr格式音乐问题
最近搞一个项目,需要获取微信端语音文件,下载之后发现是AMR格式的录音文件,这下把我搞晕了,C#中的4种播放模式不支持播放AMR,想到都觉得头痛,如何是好?最后找到的方案,其实也简单:windows ...
- wp8 安装.Net3.5
Microsoft .NET Framework 3.5 Service Pack 1 http://www.microsoft.com/zh-cn/download/details.aspx?id= ...
- 浅析十三种常用的数据挖掘的技术&五个免费开源的数据挖掘软件
一.前 沿 数据挖掘就是从大量的.不完全的.有噪声的.模糊的.随机的数据中,提取隐含在其中的.人们事先不知道的但又是潜在有用的信息和知识的过程.数据挖掘的任务是从数据集中发现模式,可以发现的模式有很多 ...