mysql Key_buffer_size参数的优化设置
先来看看document对这个参数的解释:
缓存myisam表的索引块大小,可以被所有进程所共享。当设置key_buffer_size,操作系统不会马上分配key_buffer_size设置的值,而是在需要的时候,再分配的。可以设置多个key_buffer,当设置不是默认key_buffer为0时,mysql会把缓存的索引块移到默认的key_buffer中去并删除不再使用的索引块。Myisam表中只能cache索引块,不能cache数据块。
原本描述:
IndexblocksforMyISAMtablesarebufferedandaresharedbyallthreads.key_buffer_sizeisthesizeofthebufferusedforindexblocks.Thekeybufferisalsoknownasthekeycache.
Themaximumallowablesettingforkey_buffer_sizeis4GBon32-bitplatforms.AsofMySQL5.0.52,valueslargerthan4GBareallowedfor64-bitplatforms(except64-bitWindows,forwhichlargevaluesaretruncatedto4GBwithawarning).Theeffectivemaximumsizemightbeless,dependingonyouravailablephysicalRAMandper-processRAMlimitsimposedbyyouroperatingsystemorhardwareplatform.Thevalueofthisvariableindicatestheamountofmemoryrequested.Internally,theserverallocatesasmuchmemoryaspossibleuptothisamount,buttheactualallocationmightbeless.
Increasethevaluetogetbetterindexhandling(forallreadsandmultiplewrites)toasmuchasyoucanafford.Usingavaluethatis25%oftotalmemoryonamachinethatmainlyrunsMySQLisquitecommon.However,ifyoumakethevaluetoolarge(forexample,morethan50%ofyourtotalmemory)yoursystemmightstarttopageandbecomeextremelyslow.MySQLreliesontheoperatingsystemtoperformfilesystemcachingfordatareads,soyoumustleavesomeroomforthefilesystemcache.Consideralsothememoryrequirementsofotherstorageengines.
1、建立缓存索引:
mysql>setglobalkey_buffer_1.key_buffer_size=8384512;
QueryOK,0rowsaffected(0.01sec)
mysql>setglobalkey_buffer_2.key_buffer_size=8384512;
QueryOK,0rowsaffected(0.01sec)
2、把指定表放到keybuffer中
mysql>cacheindext1,t2inkey_buffer_1;
+————+——————–+———-+———-+
|Table|Op|Msg_type|Msg_text|
+————+——————–+———-+———-+
|luoxuan.t1|assign_to_keycache|status|OK|
|luoxuan.t2|assign_to_keycache|status|OK|
+————+——————–+———-+———-+
2rowsinset(0.00sec)
3、预先装载表的索引块
mysql>loadindexintocachet1,t2;
+————+————–+———-+———-+
|Table|Op|Msg_type|Msg_text|
+————+————–+———-+———-+
|luoxuan.t1|preload_keys|status|OK|
|luoxuan.t2|preload_keys|status|OK|
+————+————–+———-+———-+
2rowsinset(0.00sec)
下面我们来看一下,如果计算命中率及keybuffer的使用率
Cache命中率:
100–((Key_reads*100)/Key_read_requests)
Keybuffer的使用率
100–((Key_blocks_unused*key_cache_block_size)*100/key_buffer_size)在mysql数据库中,mysqlkey_buffer_size是对MyISAM表性能影响最大的一个参数,下面就将对mysqlKey_buffer_size参数的设置进行详细介绍,供您参考。
下面一台以MyISAM为主要存储引擎服务器的配置:
mysql>showvariableslike'key_buffer_size';
+-----------------+------------+
|Variable_name|Value|
+-----------------+------------+
|key_buffer_size|536870912|
+-----------------+------------+
分配了512MB内存给mysqlkey_buffer_size,我们再看一下key_buffer_size的使用情况:
mysql>showglobalstatuslike'key_read%';
+------------------------+-------------+
|Variable_name|Value|
+------------------------+-------------+
|Key_read_requests|27813678764|
|Key_reads|6798830|
+------------------------+-------------+
一共有27813678764个索引读取请求,有6798830个请求在内存中没有找到直接从硬盘读取索引,计算索引未命中缓存的概率:
key_cache_miss_rate=Key_reads/Key_read_requests*100%
比如上面的数据,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>showglobalstatuslike'key_blocks_u%';
+------------------------+-------------+
|Variable_name|Value|
+------------------------+-------------+
|Key_blocks_unused|0|
|Key_blocks_used|413543|
+------------------------+-------------+
Key_blocks_unused表示未使用的缓存簇(blocks)数,Key_blocks_used表示曾经用到的最大的blocks数,比如这台服务器,所有的缓存都用到了,要么增加key_buffer_size,要么就是过渡索引了,把缓存占满了。比较理想的设置:
Key_blocks_used/(Key_blocks_unused+Key_blocks_used)*100%≈80%
key_buffer_size设置注意事项
1.单个key_buffer的大小不能超过4G,如果设置超过4G,就有可能遇到下面3个bug:
http://bugs.mysql.com/bug.php?id=29446
http://bugs.mysql.com/bug.php?id=29419
http://bugs.mysql.com/bug.php?id=5731
2.建议key_buffer设置为物理内存的1/4(针对MyISAM引擎),甚至是物理内存的30%~40%,如果key_buffer_size设置太大,系统就会频繁的换页,降低系统性能。因为MySQL使用操作系统的缓存来缓存数据,所以我们得为系统留够足够的内存;在很多情况下数据要比索引大得多。
3.如果机器性能优越,可以设置多个key_buffer,分别让不同的key_buffer来缓存专门的索引
上面只是对"新手"来说的,我们还可以更深入地优化key_buffer_size,使用"showstatus"来查看"Key_read_requests,Key_reads,Key_write_requests以及Key_writes",以调整到更适合你的应用的大小,Key_reads/Key_read_requests的大小正常情况下得小于0.01
参考资料:
http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_key_buffer_size
优化mysql之key_buffer_size
key_buffer_size
key_buffer_size指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度。通过检查状态值Key_read_requests和Key_reads,可以知道key_buffer_size设置是否合理。比例key_reads/key_read_requests应该尽可能的低,至少是1:100,1:1000更好(上述状态值可以使用SHOWSTATUSLIKE‘key_read%'获得)。
key_buffer_size只对MyISAM表起作用。即使你不使用MyISAM表,但是内部的临时磁盘表是MyISAM表,也要使用该值。可以使用检查状态值created_tmp_disk_tables得知详情。
对于1G内存的机器,如果不使用MyISAM表,推荐值是16M(8-64M)
提升性能的建议:
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优化小案例:key_buffer_size
key_buffer_size是对MyISAM表性能影响最大的一个参数,下面一台以MyISAM为主要存储引擎服务器的配置:
mysql>SHOWVARIABLESLIKE'%key_buffer_size%';
下面查看key_buffer_size的使用情况:
mysql>SHOWGLOBALSTATUSLIKE'%key_read%';
+-------------------+-----------------+
|Variable_name |Value |
+-------------------+-----------------+
|Key_read_requests|2454354135490 |
|Key_reads |23490 |
+-------------------+-----------------+
2rowsinset(0.00sec)
一共有Key_read_requests个索引请求,一共发生了Key_reads次物理IO
Key_reads/Key_read_requests≈0.1%以下比较好。
经过对比,针对我的内存是64G的,所以我把Key_buffer_size设置为2048M,感觉好多了,么有了内存溢出情况。解决了问题。后续有什么情况毛票票小编继续补充。