为了最小化磁盘的IO,MyISAM存储引擎的表使用key cache来缓存索引块,索引块的缓存大小由key_buffer_size参数来设置,如果数据库中使的表以MyISAM存储引擎为主,则应该适当增加该参

数的值,以便尽可能的缓存索引块,提高访问的速度。

默认情况下,所有的索引都使用相同的key cache,当访问的索引不在缓存中时,使用LRU(Least Recently Used最近最少使用)算法来替换缓存中最近最少使用的索引块,为了进一步避免对key cache的争用,从MSQL5.1开始,可以设置多个key cache,并为不同的索引键指定使用的key cache。

记住:key_buffer_size只能在MyISAM存储引擎使用。




show variables like 'key_buffer_size' —— 显示默认key cache的大小

set global key_buffer_size=102400 —— 设置默认key cache的大小

wKioL1cfHNCR68h_AAApp15Ej4k341.png


set global my_cache1.key_buffer_size = 204800 —— 设置自定义key cache的大小,my_cache1可以修改为其他名称,该名称就是这个key cache的名称

select @@global.my_cache1.key_buffer_size —— 显示自定义key cache的大小,如果要删除这个缓存,只需把大小设置成0就可以了

wKiom1cfI5_BQVXoAAA1JC6pTPw100.png


上面我们创建了两个自定义的缓存:my_cache1和my_cache2。下面我们在创建两张表来演示如何将索引加入缓存。

table1:

wKioL1cfJk_BA3vEAAAoF6XxhhI736.png

wKioL1cfJk-iqibtAAAjzRVjvC4966.png

table2:

wKiom1cfJZugMMfbAAAo_sINR38393.png

wKioL1cfJmXRmpmaAAAis-32FN0151.png


cache index table1, table2 in my_cache1 —— 把table1和table2中所有的索引放入my_cache1缓存。其实这里并不是马上就把索引放到缓存,而只是告诉数据库table1和table2的索引要放入名为my_cache1缓存,等使用该索引查询时才放入,或者用LOAD INDEX INTO CACHE命令预先载入。

wKiom1cfLmLjnjL5AAAX5n3gWic247.png


cache index table1 index (table1_index_id) in my_cache1 —— 把table1中名为table1_index_id的索引放入my_cache1缓存,这样可以把表的不同索引放入不同缓存。跟上面一样并不是马上就把索引放到缓存,只是建立一个索引和缓存之间的关联。

wKioL1cfL0HgmAL0AAAmDE50evU241.png


通常在数据库刚刚启动的时候,需要等待索引被缓存到缓存区中,这段时间据库会因为缓存命中率低而导致访问效率不高。这个时候我们就可以通过LOAD INDEX INTO CACHE命令将索引预加载至缓存区中。具体的操作方式是:

load index into cache table1 —— 把table1中所有的索引加载进缓存,如果索引已经关联了一个缓存则放入该缓存;如果没有,则放入系统默认缓存。

wKiom1cfMeiCG1_qAAARKThMxVY122.png


load index into cache table1 index (table1_index_id) —— 把table1中名为table1_index_id的索引加载进缓存

wKioL1cfM4fxYDH_AAARu1W1Iy4907.png




注意:默认的缓存key_buffer_size是无法删除的。如果你自定义的缓存被删除,那加载到该缓存的索引会被重新加载到默认缓存。