本文将讨论MySQL内存相关的一些选项,包括:

单位都是b,不是kb,即1B=1/(1024*1024*1024)G

  • 1)全局的buffer,如innodb_buffer_pool_size;
  • 2)线程级的选项,如binlog_cache_size;
  • 3)为特定操作分配的缓冲区,如sort_buffer_size。

我们只讨论内存相关的选项,其他一些如innodb_open_filesthread_cache_sizetable_definition_cachetable_open_cache这类限制文件描述符合线程数量的选项不在讨论之列

1. MySQL的理论内存上限

最近我们在做的一个项目,需要检查MySQL的理论内存上限,同事在http://www.mysqlcalculator.com/找到一个内存计算公式,如下所示:

key_buffer_size + query_cache_size + tmp_table_size + innodb_buffer_pool_size + innodb_additional_mem_pool_size + innodb_log_buffer_size + max_connections * (sort_buffer_size + read_buffer_size + read_rnd_buffer_size + join_buffer_size + thread_stack + binlog_cache_size)

show variables where variable_name in (
'key_buffer_size',
'query_cache_size',
'tmp_table_size',
'innodb_buffer_pool_size',
'innodb_additional_mem_pool_size',
'innodb_log_buffer_size'
); show variables like 'max_connections'; show variables where variable_name in (
'sort_buffer_size',
'read_buffer_size',
'read_rnd_buffer_size',
'join_buffer_size',
'thread_stack',
'binlog_cache_size'
);

这个公式可以说是错的,因为,这个公式并不能非常准确的描述MySQL的实际内存使用情况,实际内存使用情况远比这个公式要复杂,随着具体的应用场景不同而存在差异。这个公式也可以说是对的,因为,该公式大致估算了一个MySQL实例可能需要的内存,可以作为一个参考值。

那么,在实际应用中,我们怎么判断具体的内存使用情况?根据什么条件来调整这些参数?调整为多少比较合适呢?要回答这些问题,还得从原理讲起。

2. MySQL内存参数的含义

在这一节,我们首先对内存参数进行了一个分类,然后对各个参数的含义进行了详细的讨论。

2.1 内存参数分类

2.1.1 服务器级别

服务器级别的buffer是全局且唯一的,影响所有的连接和查询,需要注意的是,服务器级别的buffer中,大部分是服务器启动的时候分配的,小部分是后来分配的。如query_cache,初始值是0,后续不断增长,直至最大。

  • innodb_additional_mem_pool_size # 该参数查不到
  • innodb_buffer_pool_size
  • innodb_log_buffer_size
  • key_buffer_size
  • query_cache_size

sql查询语句

show variables where variable_name in (
'innodb_buffer_pool_size',
'innodb_log_buffer_size',
'innodb_additional_mem_pool_size',
'key_buffer_size',
'query_cache_size'
);
2.1.2 线程级别

这些buffer是线程级别的,对于每个线程都会分配,因此,占用的内存情况为max_connection * (thread_options),线程级别的选项有:

  • binlog_cache_size
  • binlog_stmt_cache_size
  • net_buffer_length
  • query_prealloc_size
  • thread_stack

sql查询语句

show variables where variable_name in (
'net_buffer_length',
'thread_stack',
'query_prealloc_size',
'binlog_cache_size',
'binlog_stmt_cache_size'
);
2.1.3 为特定操作分配的缓冲区

当服务器执行特殊操作时,根据需要分配缓冲区。因此,很难计算缓冲区的具体大小。好在这些缓冲区都是session级别的,我们可以保持全局较小的取值,如果需要,再修改session级别的缓冲区大小。

a.对每个线程分配一次

  • read_rnd_buffer_size
  • sort_buffer_size
  • myisam_mmap_size
  • myisam_sort_buffer_size
  • bulk_insert_buffer_size
  • preload_buffer_size

sql查询语句

show variables where variable_name in (
'read_rnd_buffer_size',
'myisam_mmap_size',
'myisam_sort_buffer_size',
'bulk_insert_buffer_size',
'preload_buffer_size'
);

b.对每个线程分配多次(可能)

  • join_buffer_size
  • read_buffer_size
  • tmp_table_size
show variables where variable_name in (
'join_buffer_size',
'read_buffer_size',
'tmp_table_size'
);

2.2 内存参数的含义

各个变量的含义比较好掌握,官方参考手册上都有,但是,什么时候应该修改,修改为多少才是合适的值?手册上并没有给出,本文将回答这个问题。

  1. query_cache_size 这是MySQL的查询缓存,用以缓冲SQL语句的结果,如果下次有相同的SQL语句,并且,结果还没有invalid掉,则直接返回查询缓存中的结果即可。这是理想情况,实际情况query_cache可能导致激烈的锁竞争,使得性能反而下降,MySQL 5.7已经可以关闭query_cache了。

  2. innodb_additional_mem_pool_size # (没有查到mysql5.7_aliyun_RDS) 该缓存用以存放数据字典和内部数据结构的信息,一般情况下,表越多,该选项也应该越大,该选项过小时,Innodb会在错误日志中打印错误信息,可以等到有错误日志以后再调整。

  3. innodb_buffer_pool_size Innodb为存储数据、索引、undo、自适应索引等分配的内存大小,影响innodb性能最重要的选项,一般设置为物理内存的80%。

  4. innodb_log_buffer_size Innodb重做日志(redo)的大小,一般取默认值即可。

  5. key_buffer_size MyISAM表缓存索引的缓存,建议不用MyISAM表。

  6. net_buffer_length 服务器在客户端连接建立以后创建的缓存大小,用来保持请求和结果。根据需要,这个大小可以增长至max_allowed_packet。

  7. thread_stack 每个线程的栈大小,如果该变量设置过小,将会限制SQL语句的复杂性、存储过程的递归深度,以及服务器上其他内存消耗型的操作。对于大部分安装来说,默认取值即可。如果有类似”Thread stack overrun”,则需要增大该值。

  8. query_prealloc_size 此缓存为语句解析和执行而分配,如果运行复杂查询,增加缓存是合理的,这样mysqld不会在执行查询的时候在分配内存上耗时。

  9. binlog_cache_size 缓存binlog的缓冲区,如果大于该值,缓存中的binlog将写到磁盘的临时文件中。

  10. binlog_stmt_cache_size 缓存非事务表的binlog。

  11. read_rnd_buffer_size 存放排序和发送结果至客户端之间,读取结果的大小,大的值能提高order by的性能

  12. sort_buffer_size 每个线程需要排序的时候会分配此缓存,通过检查sort_merge_passes状态变量来判断是否需要增加该缓存的大小。sort_buffer_size缓存经常会分配,所以,大的GLOBAL值会降低性能而不是增加性能。因此,最好不要设置得太大,在需要的时候通过set session增加即可。

  13. join_buffer_size 连接操作分配的缓冲区,为了检查是否需要增加join_buffer_size的取值,可以检查Select_sacn状态变量,它包括第一张表执行完整扫描的连接次数,同样,select_full_range_join,它包含使用范围搜索的连接次数。

  14. read_buffer_size 为表顺序扫描分配的缓存

  15. tmp_table_size 临时表的最大值,服务器默认设置为max_heap_table_size和tmp_table_size两者中较小的一个,如果有足够的内存,并且created_tmp_disk_tables状态变量再增大,则可以适当调大,把需要临时表的所有结果保持在内存中,以提高性能。

原文摘自 http://mingxinglai.com/cn/2016/04/mysql-memory-usage-formula/

http://blog.51cto.com/11819159/2129769

https://help.aliyun.com/document_detail/26316.html

msyql的内存计算的更多相关文章

  1. zw版_Halcon图像交换、数据格式、以及超级简单实用的DIY全内存计算.TXT

    zw版_Halcon图像交换.数据格式.以及超级简单实用的DIY全内存计算.TXT Halcon由于效率和其他原因,内部图像采用了很多自有格式,提高运行速度,但在数据交换方面非常麻烦. 特别是基于co ...

  2. <<SAP内存计算——HANA>> 书评

    <SAP内存计算——HANA>又是一本在地铁里读完的书,最近阅读量大增,都是托了地铁的福了. 一年多以前就在ITPUB里发过帖子问“SAP HANA归根揭底到底是什么?”,那时通过一些网络 ...

  3. 「书评」SAP内存计算——HANA

    因为工作关系,长期跟SAP打交道,所以去年就对HANA有了一些了解,只是公司目前的应用规模还较小,暂时没有上马HANA的打算,但是提前作一些学习还是很有必要的.正好清华大学出版社最近出版了这本< ...

  4. Spark的误解-不仅spark是内存计算,hadoop也是内存计算

    市面上有一些初学者的误解,他们拿spark和hadoop比较时就会说,Spark是内存计算,内存计算是spark的特性.请问在计算机领域,mysql,redis,ssh框架等等他们不是内存计算吗?依据 ...

  5. zw·10倍速大数据与全内存计算

    zw·10倍速大数据与全内存计算 zw全内存10倍速计算blog,早就在博客园机器视觉栏目发过,大数据版的一直挂着,今天抽空补上. 在<零起点,python大数据与量化交易>目录中 htt ...

  6. Spark 介绍(基于内存计算的大数据并行计算框架)

    Spark 介绍(基于内存计算的大数据并行计算框架)  Hadoop与Spark 行业广泛使用Hadoop来分析他们的数据集.原因是Hadoop框架基于一个简单的编程模型(MapReduce),它支持 ...

  7. Esper——内存计算、事件驱动、SQL支持

    教程简介Esper是一个事件流处理(ESP)和事件关联引擎(CEP的,复杂事件处理).Esper的目标是针对实时事件驱动架构(EDA).当Esper监测到事件流中又符合条件的时间发生时,即可触发Pla ...

  8. java中简单内存计算

    今天面试遇到一个问题,假设一个类中只声明一个int类型,那么这个对象多大,这里先写出解决方案,首先引入内存计算工具lucene-core, <dependency> <groupId ...

  9. [20191115]oracle实例占用内存计算.txt

    [20191115]oracle实例占用内存计算.txt --//以前学习oracle数据库时,总想了解实例占用内存多少,我曾经在一些会议底下问过一位高手,对方说计算这个相对很难,许多东西是共享的.- ...

随机推荐

  1. PHP快速入门 如何配置Apache服务器

    点击安装Apache,一直下一步 填写域名(Network Domain),服务器名(Server Name),和管理员邮箱(三条都可以任意填写) 下一步的时候选择(Custom),然后在Apache ...

  2. 循环栅栏:CyclicBarrier(司令要求任务) 读书笔记

    可以理解为循环栅栏,栅栏就是一种障碍物.假如我们将计数器设置为10,那么凑齐第一批10个线程后,计数器就会归零,然后接着凑齐下一批10个线程,这就是循环栅栏的含义. 构造器: public Cycli ...

  3. gsoap

    C++中如何使用gsoap开发WebService 1. 什么是gSOAPgSOAP是一个夸平台的,用于开发Web Service服务端和客户端的工具,在Windows.Linux.MAC OS和UN ...

  4. PHP - AJAX 与 MySQL

    PHP - AJAX 与 MySQL AJAX 可用来与数据库进行交互式通信. AJAX 数据库实例 下面的实例将演示网页如何通过 AJAX 从数据库读取信息: 本教程使用到的 Websites 表 ...

  5. 算法笔记_018:旅行商问题(Java)

    目录 1 问题描述 2 解决方案 2.1 蛮力法 2.2 减治法 2.2.1 Johson-Trotter算法 2.2.2 基于字典序的算法   1 问题描述 何为旅行商问题?按照非专业的说法,这个问 ...

  6. Jquery—Jquery中的(function($){...})(jQuery)

    当你第一眼看到"(function($){...})(jQuery)"的时候.你有什么感觉?呵呵呵,我当时还是止不住的从心底里骂了一句--操,这他妈什么劳什子.时过境迁,对于如今无 ...

  7. ubuntu 14.04为/检查磁盘时发生严重错误的解决方法

    http://jingyan.baidu.com/article/0aa22375bbffbe88cc0d6419.html

  8. iOS开发-多线程开发之线程安全篇

    前言:一块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源,比如多个线程访问同一个对象.同一个变量.同一个文件和同一个方法等.因此当多个线程访问同一块资源时,很容易会发生数据错误及数据不安 ...

  9. Python-多线程学习总结

    我们在做软件开发的时候很多要用到多线程技术.例如如果做一个下载软件象flashget就要用到.象在线视频工具realplayer也要用到因为要同时下载media stream还要播放.其实例子是很多的 ...

  10. Eclipse+PyDev 安装和配置(转)

    Python开发有很多工具,其中Eclipse+Pydev 是最常见的一种.本文简单介绍Windows下Eclipse+PyDev 安装和配置. Eclipse 是一种基于 Java 的可扩展开源开发 ...