经常有人问配置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时该如何估算内存的消耗,公式如何计算?的更多相关文章

  1. php查询mysql时,报超出内存错误(select count(distinct))时

    学时服务器查询教练所带人数时,使用select count(distinct(u_STRNO))时报超出内存错误.后参考“mysqld-nt: Out of memory解决方法”http://jin ...

  2. 启动mysql时显示:/tmp/mysql.sock 不存在的解决方法

    启动mysql时显示:/tmp/mysql.sock 不存在的解决方法 启动mysql时报错的解决(mysql 5.0.45 redhat as 43)  ====================== ...

  3. .zip版初次安装mysql时遇到的my.ini、服务无法启动以及设置登录密码的问题

    下载mysql出现的问题 若下载的是.zip版,就是免安装的直接解压就可以的出现的问题 一.需要在E:\mysql\mysql-5.7.14-winx64目录下手动添加my.ini文件(.ini文件是 ...

  4. 打开mysql时,提示 1040,Too many connections

    打开mysql时,提示 1040,Too many connections,这样就无法打开数据库,看不了表里边的内容了. 出现这个问题的原因是,同时对数据库的连接数过大,mysql默认的最大连接数是1 ...

  5. 用mysql时遇到的一些问题

    1 mysql5.7文件夹中没有my.ini文件 解决办法-> 如果是windows的系统下安装的,应该是在这个目录下面:C:\ProgramData\MySQL\MySQL Server 5. ...

  6. 启动Mysql时发生的一个关于PID文件错误问题

      今天启动mysql时出现了如下错误: [root@host1 /]# service mysql start Starting MySQL.. ERROR! The server quit wit ...

  7. CentOS命令登录MySQL时,报错ERROR 1045 (28000):

    CentOS命令登录MySQL时,报错ERROR 1045 (28000): Access denied for user root@localhost (using password: NO)错误解 ...

  8. hibernate导入大量数据时,为了避免内存中产生大量对象,在编码时注意什么,如何去除?

    Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); for ( i ...

  9. jsp页面写入中文到mysql时出现了乱码(转)

    今天自己在用jsp把中文写入mysql的时候出现乱码,从数据库中读取出来的时候也显示为“??”,感觉应该出现了编码转换过程中的字符信息丢失.然后在mysql中直接执行该命令,发现中文是正常的,所有认为 ...

随机推荐

  1. Linux系统排查3——I/O篇

    当磁盘无法写入的时候,一般有以下可能: 文件系统只读 磁盘已满 I节点使用完 一. 遇到只读的文件系统 文件系统自动设置成只读可能是系统自我保护的一种机制,因此需要实现弄清究竟是什么原因造成了文件系统 ...

  2. July 26th, Week 31st Tuesday, 2016

    The best preparation for tomorrow is doing your best today. 对明天最好的准备就是今天做到最好. The road toward tomorr ...

  3. python基础——切片

    python基础——切片 取一个list或tuple的部分元素是非常常见的操作.比如,一个list如下: >>> L = ['Michael', 'Sarah', 'Tracy', ...

  4. 【转】什麼是 Team Explorer Everywhere 2010 ?TFS 專用的 Eclipse 整合套件的安裝與設定

    前言- 大家都知道 版本管控是一件很重要的事情!而且也知道分別有 VSS , SVN , TFS 等- 多數人都會覺得, .NET 的開發工具要用 VSS . TFS .SVN 而 Java 的 Ec ...

  5. Linux内核同步机制之(二):Per-CPU变量

    转自:http://www.wowotech.net/linux_kenrel/per-cpu.html 一.源由:为何引入Per-CPU变量? 1.lock bus带来的性能问题 在ARM平台上,A ...

  6. Groovy安装配置

    一.介绍 Groovy是可以运行在 Java 平台上进行动态语言,使用方式基本与使用 Java 的方式相同,Groovy和java基本是可以实现无缝整合,它有以下一些特性: 是一个基于Java虚拟机的 ...

  7. FileHelper-文件操作辅助类

    using System; using System.Collections.Generic; using System.IO; using System.Text; namespace Whir.S ...

  8. oracle 执行计划详解

    简介:     本文全面详细介绍oracle执行计划的相关的概念,访问数据的存取方法,表之间的连接等内容.     并有总结和概述,便于理解与记忆! +++ 目录 ---     一.相关的概念    ...

  9. PHP描述冒泡排序和快速排序算法

    使用PHP描述冒泡排序和快速排序算法,对象可以是一个数组.使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组.写一个二维数组排序算法函数,能够具有通用 ...

  10. poj 1019

    懂了 题意是给一串 1 12 123 1234 12345 123456 ....这样的数字问第 i个数字是多少 Sample Input 2 8 3 Sample Output 2 2 #inclu ...