我理解的myisam引擎之四 myisam-block-size、key_cache_block_size、key_block_size

先简单说下myisam-block-size、key_cache_block_size、key_block_size这几个参数的含义和区别,如下是摘抄自我的另一篇文章我理解的myisam引擎之一 myisam表特征
myisam-block-size:看到这里的中划线了吗?对,这是一个启动选项,只能在启动时设置并且不能动态修改,或者设置在配置文件中,或者在启动命令行上。围绕这个参数应该是一个系统变量还是一个启动选项产生了一些争议。https://bugs.mysql.com/bug.php?id=34363  这个参数的意在设置MYI文件的block大小。默认值为1k,最大16k,最小1K。通常来说应该与操作系统block相同或者倍数关系,才能取得较好性能,如果小于系统block大小,就存在写读的问题:假如系统block大小4k,这里使用默认值1k,那么如果要写入一个1k大小的block,需要先将整个4k读出来,更新,然后再写进去。如果都是4k的话,就直接写。修改myisam-block-size不影响已存在的MYI文件。如果要修改已存在的MYI,需要重建索引。意义接近的有另外两个参数key_cache_block_size、key_block_size。key_cache_block_size是系统变量,可在参数文件中设置,也可动态修改。用于设置内存中存放索引的块大小,最大值16k,最小值512字节,默认1k;key_block_size作为参数项出现在create、alter ddl语句中,与myisam-block-size意义相同,都是控制MYI文件块大小。区别在于如果修改myisam-block-size默认值,并且ddl中没有指定key_block_size,则key_block_size默认等于myisam_block_size的值;如果即设置了myisam-block-size也指定了key_block_size,则MYI文件块使用key_block_size块大小。MYI的块大小有两种意义,一种是其中各个key包含的索引块的大小,一种是MYI文件头大小,这两个大小一致。举个栗子,myisam-block-size=4096,那么MYI中文件头占用4k大小,接下来就是一个个4k大小的块,组成各个key内容。假如一张表包含2个key,那么MYI初始大小包含一个4k文件头块,和2个分别属于两个key的4k块。随着插入数据越来越多,文件头块大小不变,2个key分别以4k大小的块进行扩展。具体可以通过解析MYI文件观察。按照https://dev.mysql.com/doc/internals/en/the-myi-file.html的描述,可以发现,mysql使用2字节来表示key_block_size的大小,不仅可以看到单块大小,还可以看到单块的最大大小为64k。
 

下面是我分别在myisam-block-size=4096、key_cache_block_size=4096以及myisam-block-size=1024、key_cache_block_size=1024测试的情况,都是600并发,bulk size 1000,运行半小时。
操作系统文件块大小:
[[email protected] ~]# blockdev --getbsz /dev/vda2
4096
内存页大小:
[[email protected] ~]# getconf PAGESIZE
4096
这两张图是myisam-block-size=4096、key_cache_block_size=4096的情况
我理解的myisam引擎之四 myisam-block-size、key_cache_block_size、key_block_size

磁盘io:

我理解的myisam引擎之四 myisam-block-size、key_cache_block_size、key_block_size

这两站是myisam-block-size=1024、key_cache_block_size=1024的情况:

我理解的myisam引擎之四 myisam-block-size、key_cache_block_size、key_block_size

磁盘io:

我理解的myisam引擎之四 myisam-block-size、key_cache_block_size、key_block_size

可以看出来,当4096大小的时候,平均insert  59.45k/s ;当1024大小的时候,平均insert 49.91k/s。会快16%的样子。并且当4096大小等于操作系统文件块大小时,磁盘读比较少。而1024大小的时候,就有比较多的磁盘读。

这是大量insert的情况。