问题
在一次Sql语句的测试中,我们发现一个有趣的现象:同一个测试数据集,第一次run相当的慢(average超过100ms);第二次及后面的run都很快,而且也很稳定(average 4ms)。
- sql 如下
select * from table where node_index in (?, ?. ...?)
- 每次测试跑10k条上面的sql,不同的参数
who cache the data
很显然有cache在作怪,问题是谁缓存了数据?
Mysql cache
key_buffer_size 500m -> 8 byte
query_cache_size 64m -> 0
我们调整了Mysql的 key_buffer_size和 query_cache_size (/etc/my.inf), 重启Mysql
/etc/rc.d/init.d/mysql stop
/etc/rc.d/init.d/mysql start
再次测试,发现查询还是相当的快。只有将数据集从一个10k切换到另外一个时,查询数据来慢下来。
Mysql index pre-loading
key_buffer_size 4096m
load index into cache us_ta_1 (INDEX_NODEX_INDEX);
另外测试了下Mysql的Index preloading,基本没啥效果。
OS file cache
考略到我们使用的MyISAM引擎,它相当的依赖于OS的文件缓存,而linux使用物理内存来做文件cache,我们试着清空了linux的文件缓存
echo 3 > /proc/sys/vm/drop_caches
效果立现,查询速度回到第一次查询。
warm up your data
由上可见,Mysql在重启时,在真正handle流量之前,最好首先warm up。
Mysql story in poi dedup
View more
presentations from
Alexander Lee