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中直接执行该命令,发现中文是正常的,所有认为 ...
随机推荐
- iOS NSURLConnection和异步网络请求
在日常应用中,我们往往使用AFNetworking等第三方库来实现网络请求部分.这篇文章会简要地介绍一下如何使用NSURLConnection来进行异步的网络请求. 我们先看一个小demo - (vo ...
- php请求URL中的参数有空格
url=http://www.123.com/abc.php?name=ku xiong ku xiong之间有一个空格,需要替换成%20或者+ url=http://www.123.com/abc. ...
- [Java] Java 打包成jar包 和 解压jar包
解压jar包 jar xf xxx.jar 打包成jar包 方法一:通过jar命令 jar命令的用法: 下面是jar命令的帮助说明: 用法:jar {ctxui}[vfm0Me] [jar-file] ...
- git_2-linux
在linux下搭建git环境1.创建Github账号,https://github.com2.Linux创建SSH密钥: ssh-keygen ##一直默认就可以了 3.将公钥加入到Github账户 ...
- hrbustoj 1551:基础数据结构——字符串2 病毒II(字符串匹配,BM算法练习)
基础数据结构——字符串2 病毒IITime Limit: 1000 MS Memory Limit: 10240 KTotal Submit: 284(138 users) Total Accepte ...
- hdu 1005:Number Sequence(水题)
Number Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- ThinkPHP去除url中的index.php
例如你的原路径是 http:.httpd.conf配置文件中加载了mod_rewrite.so模块 .AllowOverride None 讲None改为 All .确保URL_MODEL ...
- phpcms v9 首页怎么调取单页内容,描述,标题等
{pc:, v9 数据表前缀 catid 这是单页的id
- python网页爬虫
1. 静态页面爬取 这类最简单啦,右键->查看页面源码时,想下载的信息都能够显示在这里,这时只需要直接down页面源码,代码如下: # Simple open web import urllib ...
- 向table添加水平滚动条
转自:http://www.cnblogs.com/linjiqin/p/3148225.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4. ...