mysql key_block_size_Mysql入门mysql Key_buffer_size参数的优化设置

《Mysql入门mysql Key_buffer_size参数的优化设置》要点:

本文介绍了Mysql入门mysql Key_buffer_size参数的优化设置,希望对您有用。如果有疑问,可以联系我们。

MYSQL教程先来看看document对这个参数的解释:

MYSQL教程缓存myisam表的索引块大小,可以被所有进程所共享.当设置key_buffer_size,操作系统不会马上分配key_buffer_size设置的值,而是在需要的时候,再分配的.可以设置多个key_buffer,当设置不是默认key_buffer为0时,mysql会把缓存的索引块移到默认的key_buffer中去并删除不再使用的索引块.Myisam表中只能cache索引块,不能cache数据块.

MYSQL教程原本描述:

MYSQL教程Index blocks for MyISAM tables are buffered and are shared by all threads. key_buffer_size is the size of the buffer used for index blocks. The key buffer is also known as the key cache.

MYSQL教程The maximum allowable setting for key_buffer_size is 4GB on 32-bit platforms. As of MySQL 5.0.52, values larger than 4GB are allowed for 64-bit platforms (except 64-bit Windows, for which large values are truncated to 4GB with a warning). The effective maximum size might be less, depending on your available physical RAM and per-process RAM limits imposed by your operating system or hardware platform. The value of this variable indicates the amount of memory requested. Internally, the server allocates as much memory as possible up to this amount, but the actual allocation might be less.

MYSQL教程Increase the value to get better index handling (for all reads and multiple writes) to as much as you can afford. Using a value that is 25% of total memory on a machine that mainly runs MySQL is quite common. However, if you make the value too large (for example, more than 50% of your total memory) your system might start to page and become extremely slow. MySQL relies on the operating system to perform file system caching for data reads, so you must leave some room for the file system cache. Consider also the memory requirements of other storage engines.

MYSQL教程1、建立缓存索引 :

MYSQL教程mysql> set global key_buffer_1.key_buffer_size=8384512;

Query OK, 0 rows affected (0.01 sec)

mysql> set global key_buffer_2.key_buffer_size=8384512;

Query OK, 0 rows affected (0.01 sec)

MYSQL教程2、把指定表放到key buffer中

MYSQL教程mysql> cache index t1,t2 in key_buffer_1;

+――――+――――――C+―――-+―――-+

| Table | Op | Msg_type | Msg_text |

+――――+――――――C+―――-+―――-+

| luoxuan.t1 | assign_to_keycache | status | OK |

| luoxuan.t2 | assign_to_keycache | status | OK |

+――――+――――――C+―――-+―――-+

2 rows in set (0.00 sec)

MYSQL教程3、预先装载表的索引块

MYSQL教程mysql> load index into cache t1,t2;

+――――+――――C+―――-+―――-+

| Table | Op | Msg_type | Msg_text |

+――――+――――C+―――-+―――-+

| luoxuan.t1 | preload_keys | status | OK |

| luoxuan.t2 | preload_keys | status | OK |

+――――+――――C+―――-+―――-+

2 rows in set (0.00 sec)

MYSQL教程下面我们来看一下,如果计算命中率及key buffer的使用率

MYSQL教程Cache命中率:

100 C ( (Key_reads * 100) / Key_read_requests )

MYSQL教程Key buffer的使用率

100 C ( (Key_blocks_unused * key_cache_block_size) * 100 / key_buffer_size )在mysql数据库中,mysql key_buffer_size是对MyISAM表性能影响最大的一个参数,下面就将对mysql Key_buffer_size参数的设置进行详细介绍,供您参考.

MYSQL教程下面一台以MyISAM为主要存储引擎服务器的配置:

MYSQL教程mysql> show variables like 'key_buffer_size';

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

| Variable_name | Value |

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

| key_buffer_size | 536870912 |

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

MYSQL教程分配了512MB内存给mysql key_buffer_size,我们再看一下key_buffer_size的使用情况:

mysql> show global status like 'key_read%';

MYSQL教程+------------------------+-------------+

| Variable_name | Value |

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

| Key_read_requests | 27813678764 |

| Key_reads | 6798830 |

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

MYSQL教程一共有27813678764个索引读取请求,有6798830个请求在内存中没有找到直接从硬盘读取索引,计算索引未命中缓存的概率:

MYSQL教程key_cache_miss_rate = Key_reads / Key_read_requests * 100%

MYSQL教程比如上面的数据,key_cache_miss_rate为0.0244%,4000个索引读取请求才有一个直接读硬盘,已经很BT了,key_cache_miss_rate在0.1%以下都很好(每1000个请求有一个直接读硬盘),如果key_cache_miss_rate在0.01%以下的话,key_buffer_size分配的过多,可以适当减少.

MySQL服务器还提供了key_blocks_*参数:

MYSQL教程mysql> show global status like 'key_blocks_u%';

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

| Variable_name | Value |

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

| Key_blocks_unused | 0 |

| Key_blocks_used | 413543 |

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

MYSQL教程Key_blocks_unused表示未使用的缓存簇(blocks)数,Key_blocks_used表示曾经用到的最大的blocks数,比如这台服务器,所有的缓存都用到了,要么增加key_buffer_size,要么就是过渡索引了,把缓存占满了.比较理想的设置:

MYSQL教程Key_blocks_used / (Key_blocks_unused + Key_blocks_used) * 100% ≈ 80%

MYSQL教程key_buffer_size设置注意事项

1.单个key_buffer的大小不能超过4G,如果设置超过4G,就有可能遇到下面3个bug:

MYSQL教程http://bugs.mysql.com/bug.php?id=29446

MYSQL教程http://bugs.mysql.com/bug.php?id=29419

MYSQL教程http://bugs.mysql.com/bug.php?id=5731

MYSQL教程2.建议key_buffer设置为物理内存的1/4(针对MyISAM引擎),甚至是物理内存的30%~40%,如果key_buffer_size设置太大,系统就会频繁的换页,降低系统性能.因为MySQL使用操作系统的缓存来缓存数据,所以我们得为系统留够足够的内存;在很多情况下数据要比索引大得多.

MYSQL教程3.如果机器性能优越,可以设置多个key_buffer,分别让不同的key_buffer来缓存专门的索引

MYSQL教程上面只是对"新手"来说的,我们还可以更深入地优化key_buffer_size,使用"show status"来查看"Key_read_requests, Key_reads, Key_write_requests 以及Key_writes ",以调整到更适合你的应用的大小,Key_reads/Key_read_requests的大小正常情况下得小于0.01

MYSQL教程参考资料:

MYSQL教程http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_key_buffer_size

MYSQL教程优化mysql之key_buffer_size

MYSQL教程key_buffer_size

key_buffer_size指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度.通过检查状态值Key_read_requests和Key_reads,可以知道key_buffer_size设置是否合理.比例key_reads /key_read_requests应该尽可能的低,至少是1:100,1:1000更好(上述状态值可以使用SHOW STATUS LIKE ‘key_read%'获得).

key_buffer_size只对MyISAM表起作用.即使你不使用MyISAM表,但是内部的临时磁盘表是MyISAM表,也要使用该值.可以使用检查状态值created_tmp_disk_tables得知详情.

对于1G内存的机器,如果不使用MyISAM表,推荐值是16M(8-64M)

MYSQL教程提升性能的建议:

1.如果opened_tables太大,应该把my.cnf中的table_cache变大

2.如果Key_reads太大,则应该把my.cnf中key_buffer_size变大.可以用Key_reads/Key_read_requests计算出cache失败率

3.如果Handler_read_rnd太大,则你写的SQL语句里很多查询都是要扫描整个表,而没有发挥键的作用

4.如果Threads_created太大,就要增加my.cnf中thread_cache_size的值.可以用Threads_created/Connections计算cache命中率

5.如果Created_tmp_disk_tables太大,就要增加my.cnf中tmp_table_size的值,用基于内存的临时表代替基于磁盘的

MYSQL教程MySQL优化小案例:key_buffer_size

key_buffer_size是对MyISAM表性能影响最大的一个参数,下面一台以MyISAM为主要存储引擎服务器的配置:

MYSQL教程mysql> SHOW VARIABLES LIKE '%key_buffer_size%';

下面查看key_buffer_size的使用情况:

MYSQL教程mysql> SHOW GLOBAL STATUS LIKE '%key_read%';

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

| Variable_name     | Value           |

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

| Key_read_requests | 2454354135490   |

| Key_reads         | 23490           |

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

2 rows in set (0.00 sec)

一共有Key_read_requests个索引请求,一共发生了Key_reads次物理IO

MYSQL教程Key_reads/Key_read_requests ≈ 0.1%以下比较好.

MYSQL教程经过对比,针对我的内存是64G的,所以我把Key_buffer_size设置为2048M,感觉好多了,么有了内存溢出情况.解决了问题.后续有什么情况维易PHP小编继续补充.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值