MyISAM内存优化

MyISAM存储引擎使用 key buffer缓存索引块,以加速MyISAM索引的读写速度。对于MyISAM变的数据库块,MySQL没有铁别的缓存机制,完全依赖操作系统的IO缓存。
key_buffer_size设置
key_buffer_size决定MyISAM索引块缓存区的大小,直接影响到MyISAM表的存取效率。可以在MySQL参数文件中设置key_buffer_size的值,对于一般MyISAM数据库,建议至少将1/4可用内存分配给key_buffer_size。
我们可以通过检查key_read_requests、key_reads、key_write_requests和key_writes等MySQL状态来评估索引缓存的效率。一般来说,索引块物理读比率key_reads/key_read_requests应该小于0.01。索引块写比率key_wirte/key_write_requests也应尽可能小。但是这与应用特点有关,对于更新和删除操作特别多的应用,key_writes/key_wirte_requests可能会接近1,而对于 更新很多行记录的应用,key_wirtes/key_write_requests就会比较小。
除了通过索引块的物理读写比率衡量key_buffer的效率外,我们也可以通过评估key buffer的使用率来判断索引缓存设置是否合理。key buffer使用率计算公式如下:
1-((key_blocks_unused*key_cache_block_size)/key_buffer_size)
一般来说,使用率在80%左右笔记哦啊合适,大于80%可能因索引还粗不足而导致性能下降,小于80%会导致内存浪费
设置key_buffer_size
mysql>set global key_buffer_size=8088608;
Query OK, 0 rows affected, 1 warning (0.00sec)
永久设置
[root@localhostbinlog]# vim /etc/my.sql
[mysql]
key_buffer_size=8088608
查看key_buffer_size
mysql> show variables like’key_buffer_size’;
+—————–+———+
| Variable_name | Value |
+—————–+———+
| key_buffer_size | 8388608 |
+—————–+———+
1 row in set (0.00 sec)

mysql>show global status like ‘key_%’;
+————————+——-+
| Variable_name | Value |
+————————+——-+
| Key_blocks_not_flushed | 0 |
| Key_blocks_unused | 6452 |
| Key_blocks_used | 0 |
| Key_read_requests | 0 |
| Key_reads | 0 |
| Key_write_requests | 0 |
| Key_writes | 0 |
+————————+——-+
7 rows in set (0.00 sec)
使用多个索引缓存
MySQL通过session共享的key buffer提高了MyISAM索引存取的性能,但是冰不能消除session间对key buffer的竞争。比如一个session如果对某个很大的索引进行扫描,就可能将其他的索引数据基础索引缓存区,而这些索引块可能是其他session要用的热数据。
新建key buffer
mysql>set global hot_cache.key_buffer_size=128*1024;
Query OK, 0 rows affected (0.01 sec)
hot_cache是新建索引的缓存名。
删除key buffer
mysql>set global hot_cache.key_buffer_size=0;
Query OK, 0 rows affected (0.01 sec)
但是我们不能删除默认的keybuffer
将某个表的索引加入到新建的key buffer中
mysql>cache index t1 in hot_cache;
+———-+——————–+———-+———-+
| Table | Op | Msg_type |Msg_text |
+———-+——————–+———-+———-+
| test2.t1 | assign_to_keycache |status | OK |
+———-+——————–+———-+———-+
1 row in set (0.00 sec)
T1表示T1表

在配置文件自动创建并加载索引缓存
[root@localhostbinlog]# vim /etc/my.sql
[mysql]
key_buffer_size=8088608
hot_cache.key_buffer_size=128*1024
cold_cache.key_buffer_size=1G
init_file=/usr/local/mysql/config/mysqld_init.sql
[root@localhostbinlog]# vim /usr/local/mysql/config/mysqld_init.sql
cache index t1 hot_cache
cache index t2 cold_cache;
load index into cache t1,t2;

调整“中点插入策略”

     MySQL默认使用简单的LRU(LeastRecently Used)策略来选择要淘汰的索引数据库。但这种算法很可能在某些情况下导致真正的热块被淘汰。
     如果出现这种情况,除了使用上面介绍的多高索引缓存机制外,还可以利用中点插入策略(Midpoint Insertion Strategy)来优化索引块淘汰算法。
     可以调整key_cache_division_limit来控制多大比例的缓存块做warm子表,key_cache_division_limit的默认值是100,意思是全部缓存块都放在warm子表,其实也就是不启用“中点查询策略”。如果我们希望大致30%的缓存用来cache最热的索引块,可以对key_cache_division_limit做如下设置;
     SETglobal key_cache_division_limit=70;
     SETglobal hot_cache.key_cache_division_limit=70;

除了调节warm子表的比例外,还可以通过key_cache_age_threshold控制数据块由hot子表向warm子表降级的时间,值越小,数据降级越快。对于有N个块的索引缓存来说,如果一个在hot子表头部的索引块,在最后N*key_cache_age_threshold/100次缓存命准内未被访问过,就会被降级到warm子表
调整read_buffer_size和read_rnd_buffer_size
如果需要经常扫描MyISAM表,可以通过增大read_buffer_size的值来改善性能。但是注意的是read_buffer_size是每个session独占的,如果默认设置太大就会造成资源浪费,甚至导致物理内存耗尽。
对于需要排序的MyISAM表,应适当增大read_rnd_buffer_size的值,也可以改善此类SQL的性能。但是要注意此参数也是按SESSION分配的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值