日期:2014-05-16  浏览次数:20855 次

MySQL内存及虚拟内存优化设置

1、

mysqld --verbose --help

这个命令生成所有mysqld选项和可配置变量的列表

2、

?

通过连接它并执行这个命令,可以看到实际上使用的变量的值:

mysql> SHOW VARIABLES;

还可以通过下面的语句看到运行服务器的统计和状态指标:

mysql>SHOW STATUS;

使用mysqladmin还可以获得系统变量和状态信息:

shell> mysqladmin variables

shell> mysqladmin extended-status

shell> mysqladmin flush-table 命令可以立即关闭所有不使用的表并将所有使用中的表标记为已经关闭,这样可以有效释放大多数使用中的内存。FLUSH TABLE在关闭所有表之前不返回结果。

?

swap -s检查可用交换区

?

mysql内存计算公式

?

mysql used mem = key_buffer_size + query_cache_size + tmp_table_size

+ innodb_buffer_pool_size + innodb_additional_mem_pool_size

+ innodb_log_buffer_size

+ max_connections * (

read_buffer_size + read_rnd_buffer_size

+ sort_buffer_size+ join_buffer_size

+ binlog_cache_size + thread_stack

)

?

在mysql 中输入如下命令,可自动计算自己的当前配置最大的内存消耗

?

SHOW VARIABLES LIKE 'innodb_buffer_pool_size';

SHOW VARIABLES LIKE 'innodb_additional_mem_pool_size';

SHOW VARIABLES LIKE 'innodb_log_buffer_size';

SHOW VARIABLES LIKE 'thread_stack';

SET @kilo_bytes = 1024;

SET @mega_bytes = @kilo_bytes * 1024;

SET @giga_bytes = @mega_bytes * 1024;

SET @innodb_buffer_pool_size = 2 * @giga_bytes;

SET @innodb_additional_mem_pool_size = 16 * @mega_bytes;

SET @innodb_log_buffer_size = 8 * @mega_bytes;

SET @thread_stack = 192 * @kilo_bytes;

SELECT

( @@key_buffer_size + @@query_cache_size + @@tmp_table_size

+ @innodb_buffer_pool_size + @innodb_additional_mem_pool_size

+ @innodb_log_buffer_size

+ @@max_connections * (

@@read_buffer_size + @@read_rnd_buffer_size + @@sort_buffer_size

+ @@join_buffer_size + @@binlog_cache_size + @thread_stack

) ) / @giga_bytes AS MAX_MEMORY_GB;

?

?

mysql关键参数设置

Mysqld 数据库的参数设置有两种类型,

?

一种是全局参数,影响服务器的全局操作;

另一种是会话级参数,只影响当前的客户端连接的相关操作。

?

服务器启动时,所有全局参数都初始化为默认值。可以在初始化文件或命令行中指定的选项来更改这些默认值。服务器启动后,通过连接服务器并执行 SET GLOBAL var_name 语句可以更改动态全局参数。要想更改全局参数,必须具有 SUPER 权限。全局参数的修改只对新的连接生效,已有的客户端连接并不会生效。

?

服务器还可以为每个客户端连接维护会话级参数,客户端连接时使用相应全局参数的当前值对客户端会话参数进行初始化。客户可以通过 SET SESSION var_name 语句来更改动态会话参数。设置会话级参数不需要特殊权限,但每个客户端可以只更改自己的会话级参数,不能更改其它客户的会话级参数。

不指定设置的参数类型时,默认设置的是会话级参数。

?

?

(1)、max_connections:

允许的同时客户的数量。增加该值增加 mysqld 要求的文件描述符的数量。这个数字应该增加,否则,你将经常看到 too many connections 错误。 默认数值是100,我把它改为1024 。

?

(2)、record_buffer:

每个进行一个顺序扫描的线程为其扫描的每张表分配这个大小的一个缓冲区。如果你做很多顺序扫描,你可能想要增加该值。默认数值是131072(128k),我把它改为16773120 (16m)

?

(3)、key_buffer_size:

为了最小化磁盘的 I/O , MyISAM 存储引擎的表使用键高速缓存来缓存索引,这个键高速缓存的大小则通过 key-buffer-size 参数来设置。如果应用系统中使用的表以 MyISAM 存储引擎为主,则应该适当增加该参数的值,以便尽可能的缓存索引,提高访问的速度。

?

索引块是缓冲的并且被所有的线程共享。key_buffer_size是用于索引块的缓冲区大小,增加它可得到更好处理的索引(对所有读和多重写),到你能负担得起那样多。如果你使它太大,系统将开始换页并且真的变慢了。默认数值是8388600(8m),我的mysql主机有2gb内存,所以我把它改为 402649088(400mb)。

默认情况下,所有的索引都使用相同的键高速缓存,当访问的索引不在缓存中时,使用 LRU ( Least Recently Used 最近最少使用)算法来替换缓存中最近最少使用的索引块。为了进一步避免对键高速缓存的争用,从 MySQL5.1 开始,可以设置多个键高速缓存,并为不同的索引键指定使用的键高速缓存。下面的例子演示如何修改高速键缓存的值,如何设置多个键高速缓存,以及如何为不同的索引指定不同的缓存:

显示当前的参数大小,为16M:

mysql> show variables like 'key_buffer_size';

+-----------------+-------+

| Variable_name | Value |

+-----------------+-------+

| key_buffer_size | 16384 |

+-----------------+-------+

1 row in set (0.00 sec)

修改参数值到200M:

mysql> set global key_buffer_size=204800;

Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'key_buffer_size';

+-----------------+--------+

| Variable_name | Value |

+-----------------+--------+

| key_buffer_size | 204800 |

+-----------------+--------+

1 row in set (0.00 sec)

上面介绍的是默认的键缓存,下面介绍如何设置多个键缓存:

设置 hot_cache 的键缓存 100M , c