`
BucketLi
  • 浏览: 195853 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
5a76a659-f8e6-3bf3-b39a-8ae8f7a0f9d9
Percolator与分布...
浏览量:5686
社区版块
存档分类
最新评论

MySQL源码分析(2):Mysql中的内存分配相关(转)

 
阅读更多
原文地址:http://software.intel.com/zh-cn/blogs/2010/09/01/mysql2mysql/

1.涉及到内存的配置参数
    这些参数可以分成两部分,分别对应MySQL中的两个层次:服务器层和存储引擎层。

(1).MySQL服务器相关:
每个连接到MySQL服务器的线程都需要有自己的缓冲,默认为其分配256K。事务开始之后,则需要增加更多的空间。运行较小的查询可能仅给指定的线程增加少量的内存消耗,例如存储查询语句的空间等。但如果对数据表做复杂的操作比较复杂,例如排序则需要使用临时表,此时会分配大约read_buffer_size,sort_buffer_size,read_rnd_buffer_size,tmp_table_size大小的内存空间。不过它们只是在需要的时候才分配,并且在那些操作做完之后就释放了。

read_buffer_size是MySql读入缓冲区大小。对表进行顺序扫描的请求将分配一个读入缓冲区,MySql会为它分配一段内存缓冲区。read_buffer_size变量控制这一缓冲区的大小。如果对表的顺序扫描请求非常频繁,并且你认为频繁扫描进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能。

sort_buffer_size是MySql执行排序使用的缓冲大小。如果想要增加ORDER BY的速度,首先看是否可以让MySQL使用索引而不是额外的排序阶段。如果不能,可以尝试增加sort_buffer_size变量的大小。该变量会监测sort_merge_passed, sort_range, sort_rows, sort_scan的状况。通常较小的sort_merge_passed性能越高,但是也与workload的特性有关。

read_rnd_buffer_size是MySql的随机读缓冲区大小。当按任意顺序读取行时(例如,按照排序顺序),将分配一个随机读缓存区。进行排序查询时,MySql会首先扫描一遍该缓冲,以避免磁盘搜索,提高查询速度,如果需要排序大量数据,可适当调高该值。但MySql会为每个客户连接发放该缓冲空间,所以应尽量适当设置该值,以避免内存开销过大。

query_cache_size是MySql的查询缓冲大小。(从4.0.1开始,MySQL提供了查询缓冲机制)使用查询缓冲,MySQL将SELECT语句和查询结果存放在缓冲区中,今后对于同样的SELECT语句(区分大小写),将直接从缓冲区中读取结果。根据MySQL用户手册,使用查询缓冲最多可以达到238%的效率。

此外还有每个连接中会使用的一些变量会消耗少量内存。

(2).MyISAM引擎相关
key_buffer_size存储了所有index的缓存,一般我们设为16M,通过检查状态值

Key_read_requests和Key_reads,可以知道key_buffer_size设置是否合理。比例key_reads / key_read_requests应该尽可能的低,至少是1:100,1:1000更好(上述状态值可以使用'key_read%'获得用来显示状态数据)。key_buffer_size只对MyISAM表起作用。即使不使用MyISAM存储引擎,但是内部的临时磁盘表是MyISAM表,故也要使用该值。

(3).InnoDB引擎相关
innodb_buffer_pool_size对于InnoDB表来说,作用就相当于key_buffer_size对于MyISAM表的作用一样。InnoDB使用该参数指定大小的内存来缓冲数据和索引。对于单独的MySQL数据库服务器,手册上推荐把该值设置成物理内存的80%。

innodb_additional_mem_pool_size指定InnoDB用来存储数据字典和其他内部数据结构的内存池大小。缺省值是1M。通常不用太大,只要够用就行,应该与表结构的复杂度有关系。如果不够用,MySQL会在错误日志中写入一条警告信息。

innodb_log_buffer_size指定InnoDB用来存储日志数据的缓存大小,如果您的表操作中包含大量并发事务(或大规模事务),并且在事务提交前要求记录日志文件,请尽量调高此项值,以提高日志效率。

Key_buffer_size

Table_open_cache

Sort_buffer_size

Read_buffer_size

Net_buffer_length

Read_rnd_buffer_size

Innodb_buffer_pool_size

Innodb_additional_mem_pool_size

Innodb_log_buffer_size

Query_cache_size

2.Mysql中最小内存占用公式

key buffer

innodb buffer pool

innodb log buffer

innodb additional mempool

net buffer

sort buffer

myisam sort buffer

read buffer

join buffer

readrnd buffer

minmemoryneeded = globalbuffers + (threadbuffers * max_connections)

其中globalbuffers 包括:
threadbuffers 包括:

...没写完,待续...
分享到:
评论

相关推荐

    MySQL之innodb源码分析之page结构解析

    总的来说,"MySQL之InnoDB源码分析之page结构解析"是一个深入探讨数据库内部运作机制的主题,涵盖了数据库管理、数据存储、查询优化等多个方面。通过学习和理解这部分内容,不仅可以提升数据库的维护能力,也为...

    mysql源码包

    MySQL是世界上最受欢迎的开源关系型数据库管理系统之一,其源码包提供了深入了解系统内部运作...总的来说,MySQL源码分析对于数据库开发者、运维人员或希望深入学习数据库原理的人来说,都是一个极其有价值的实践项目。

    mysql5.5.25 源码阅读笔记

    7. **内存管理和缓存策略**:理解内存分配、释放机制,以及如何通过调整缓冲池大小来优化性能。 通过深入阅读MySQL 5.5.25的源码,我们可以了解到数据库系统的底层运作,这对于提升数据库性能调优能力,解决实际...

    高性能mysql源码.rar

    MySQL是一款广泛使用的开源关系型数据库管理系统,以其高效...或者针对特定硬件环境调整内存分配策略,最大化硬件利用率。因此,对"高性能MySQL源码"的探索对于数据库管理员、开发者和系统架构师来说都具有很高的价值。

    mysql5.7源码包.tar.gz

    8. **Memory优化**:通过改进内存分配和减少内存碎片,提高了内存使用效率。 9. **SQL标准的扩展**:增加了对更多SQL标准功能的支持,比如窗口函数和Common Table Expressions(CTE)。 编译MySQL 5.7源码包的基本...

    mysql-5.5.19最新的mysql源码

    7. **内存管理**:MySQL使用自定义的内存池管理,如`sql/mem_root.h`定义的`MEM_ROOT`结构,用于高效地分配和回收内存。 8. **线程与并发**:MySQL在多线程环境下运行,`mysys/my_thread.h`和`mysys/thr_mutex.cc`...

    mysql源代码,深入学习mysql必须分析其源代码

    `heap`可能涉及到内存管理,MySQL在处理大量数据时需要高效地分配和释放内存,这个部分的源代码将揭示其内存池管理策略。 `myisamchk`和`myisam`是MyISAM存储引擎的相关工具,`myisamchk`用于检查、修复和优化...

    MySQL 5.1中文手冊

    5.7.6. 访问控制, 阶段2:请求核实 5.7.7. 权限更改何时生效 5.7.8. 拒绝访问错误的原因 5.7.9. MySQL 4.1中的密码哈希处理 5.8. MySQL用户账户管理 5.8.1. MySQL用户名和密码 5.8.2. 向MySQL增加新用户账户 5.8.3. ...

    mysql5.6.12社区版本

    - 优化了内存分配策略,减少了内存碎片,提高了内存利用率。 6. **JSON 支持**: 虽然 MySQL 5.6 不直接支持 JSON 数据类型,但可以使用 TEXT 或 BLOB 存储 JSON 文档,并通过内置函数进行解析和操作。 7. **...

    mysql官方中文参考手册

    5.7.6. 访问控制, 阶段2:请求核实 5.7.7. 权限更改何时生效 5.7.8. 拒绝访问错误的原因 5.7.9. MySQL 4.1中的密码哈希处理 5.8. MySQL用户账户管理 5.8.1. MySQL用户名和密码 5.8.2. 向MySQL增加新用户账户 5.8.3. ...

    ruby 内存分配访问无效

    标签中的“源码”可能提示问题可能与Ruby的内部实现或自定义C扩展有关,而“工具”可能是指用于诊断和修复问题的工具或技术。 在文件列表中,“libmySQL.dll”是一个动态链接库文件,通常用于连接MySQL数据库。这...

    mysql-5.5.46.tar.gz 源码包

    12. **内存管理**:优化了内存分配和管理,减少内存碎片,提高内存利用率。 总结,`mysql-5.5.46.tar.gz`源码包包含了许多关键特性,不仅提供了强大的数据库服务,还注重性能优化、安全性以及易用性。通过深入理解...

    MySQL 5.1官方简体中文参考手册

    5.7.6. 访问控制, 阶段2:请求核实 5.7.7. 权限更改何时生效 5.7.8. 拒绝访问错误的原因 5.7.9. MySQL 4.1中的密码哈希处理 5.8. MySQL用户账户管理 5.8.1. MySQL用户名和密码 5.8.2. 向MySQL增加新用户账户 5.8.3. ...

    mysql5.1中文手册

    访问控制, 阶段2:请求核实 5.7.7. 权限更改何时生效 5.7.8. 拒绝访问错误的原因 5.7.9. MySQL 4.1中的密码哈希处理 5.8. MySQL用户账户管理 5.8.1. MySQL用户名和密码 5.8.2. 向MySQL增加新用户...

    MySQL 5.1参考手册中文版

    5.7.6. 访问控制, 阶段2:请求核实 5.7.7. 权限更改何时生效 5.7.8. 拒绝访问错误的原因 5.7.9. MySQL 4.1中的密码哈希处理 5.8. MySQL用户账户管理 5.8.1. MySQL用户名和密码 5.8.2. 向MySQL增加新用户账户 ...

    MySQL5.1参考手册官方简体中文版

    5.7.6. 访问控制, 阶段2:请求核实 5.7.7. 权限更改何时生效 5.7.8. 拒绝访问错误的原因 5.7.9. MySQL 4.1中的密码哈希处理 5.8. MySQL用户账户管理 5.8.1. MySQL用户名和密码 5.8.2. 向MySQL增加新用户账户 5.8.3. ...

    mysql Unable to lock ./ibdata1, error: 11

    标题“mysql Unable to lock ./ibdata1, error: 11”所反映的问题是MySQL数据库在运行过程中遇到了一个常见的错误,提示无法锁定数据文件`ibdata1`,错误代码11。这个错误通常与数据库的表空间管理、并发操作或者...

    mysql-5.5.40.tar.gz

    本文将详细介绍MySQL 5.5.40版本的关键特性和源码分析。 首先,MySQL 5.5系列是MySQL的一个重大升级,它在性能、可扩展性以及新功能方面都有显著提升。5.5.40作为该系列的一个稳定版本,主要关注于修复已知问题,...

    MySQL 5.1参考手册

    5.7.6. 访问控制, 阶段2:请求核实 5.7.7. 权限更改何时生效 5.7.8. 拒绝访问错误的原因 5.7.9. MySQL 4.1中的密码哈希处理 5.8. MySQL用户账户管理 5.8.1. MySQL用户名和密码 5.8.2. 向MySQL增加新用户账户 5.8.3. ...

    mysql-5.6.17.tar.gz

    9. **内存管理**:改进了内存分配策略,减少了内存碎片,提高了内存利用率。 **源码安装流程:** 1. **解压源码**:首先,需要将"mysql-5.6.17.tar.gz"这个压缩包解压,通常使用`tar -zxvf mysql-5.6.17.tar.gz`...

Global site tag (gtag.js) - Google Analytics