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 , cold_cache 的键缓存 100M ,另外还有 200M 的默认的键缓存。如果索引不指定键缓存,则会放在默认的键缓存中。 mysql> set global hot_cache.key_buffer_size=102400; Query OK, 0 rows affected (0.00 sec) mysql> set global cold_cache.key_buffer_size= 1024 00; Query OK, 0 rows affected (0.01 sec) mysql> show variables like "key_buffer_size"; +-----------------+--------+ | Variable_name | Value | +-----------------+--------+ | key_buffer_size | 204800 | +-----------------+--------+ 1 row in set (0.00 sec) 如果要显示设置的多键缓存的值,可以使用: mysql> SELECT @@global.hot_cache.key_buffer_size; +------------------------------------+ | @@global.hot_cache.key_buffer_size | +------------------------------------+ | 102400 | +------------------------------------+ 1 row in set (0.03 sec) mysql> SELECT @@global.cold_cache.key_buffer_size; +-------------------------------------+ | @@global.cold_cache.key_buffer_size | +-------------------------------------+ | 102400 | +-------------------------------------+ 1 row in set (0.00 sec) 指定不同的索引使用不同的键缓存: mysql> CACHE INDEX test1 in hot_cache; +------------+--------------------+----------+----------+ | Table | Op | Msg_type | Msg_text | +------------+--------------------+----------+----------+ | test .test1 | assign_to_keycache | status | OK | +------------+--------------------+----------+----------+ 1 row in set (0.00 sec) mysql> CACHE INDEX test2 in hot_cache; +------------+--------------------+----------+----------+ | Table | Op | Msg_type | Msg_text | +------------+--------------------+----------+----------+ | test .test2 | assign_to_keycache | status | OK | +------------+--------------------+----------+----------+ 1 row in set (0.00 sec) 通常在数据库刚刚启动的时候,需要等待数据库热起来,也就是等待数据被缓存到缓存区中,这段时间数据库会因为 buffer 的命中率低而导致应用的访问效率不高。使用键高速缓存的时候,可以通过命令将索引预加载到缓存区中,大大缩短了数据库预热的时间。具体的操作方式是: mysql> LOAD INDEX INTO CACHE test1,test2 IGNORE LEAVES; +------------+--------------+----------+----------+ | Table | Op | Msg_type | Msg_text | +------------+--------------+----------+----------+ | test .test1 | preload_keys | status | OK | | test .test2 | preload_keys | status | OK | +------------+--------------+----------+----------+ 2 rows in set (3.89 sec) 如果已经使用 CACHE INDEX 语句为索引分配了一个键高速缓冲,预加载可以将索引块放入该缓存,否则,索引块将被加载到默认的键高速缓冲。
InnoDB占用的内存,除innodb_buffer_pool_size用于存储页面缓存数据外,另外正常情况下还有大约8%的开销,主要用在每个缓存页帧的描述、adaptive hash等数据结构,如果不是安全关闭,启动时还要恢复的话,还要另开大约12%的内存用于恢复,两者相加就有差不多21%的开销。 这样,12G的innodb_buffer_pool_size,最多的时候InnoDB就可能占用到14.5G(12G X 21%)的内存,再加上操作系统用的几百M,近千个线程堆栈,就差不多16G了。
MAX_QUERIES_PER_HOUR 用来限制用户每小时运行的查询数量: mysql> grant all on dbname。* to db@localhost identified by “123456” with max_connections_per_hour 5; (db用户在dbname的数据库上控制用户每小时打开新连接的数量为5个)
MAX_USER_CONNECTIONS 限制有多少用户连接MYSQL服务器: mysql> grant all on dbname。* to db@localhost identified by “123456” with max_user_connections 2; (db用户在dbname的数据库账户一次可以同时连接的最大连接数为2个) MAX_UPDATES_PER_HOUR 用来限制用户每小时的修改数据库数据的数量: mysql> grant all on dbname。* to db@localhost identified by “123456” with max_updates_per_hour 5; (db用户在dbname的数据库上控制用户每小时修改更新数据库的次数为5次) MAX_USER_CONNECTIONS 用来限制用户每小时的修改数据库数据的数量: mysql> grant all on dbname。* to db@localhost identified by “123456” With MAX_QUERIES_PER_HOUR 20 ;指mysql单个用户的最大连接数 (db用户在dbname的数据库上控制用户每小时的连接数为20个)