MySQL5.5后默认存储引擎都是innodb。一般生产数据库重启之后,都需要进行预热,加载数据到innodb_buffer_pool业务正常的对数据读取会加热数据,但这个过程很漫长且影响服务,那重启mysql之后我们该怎么人工预热呢?
对于MyISAM表,表的统计信息都是现成的,无需人工预热。
但InnoDB的存储格式和MyISAM不一样, innodb会在mysql启动后的第一次访问表的时候,统计表的索引基数等相关信息,如果表很多的话,这是一个巨大的开销。所以在正式提供服务之前,就把表打开,放入到innodb buffer pool中。 默认情况,只有某条数据被读取一次,才会缓存在innodb_buffer_pool。所以,数据库刚刚启动,需要进行数据预热,将磁盘上所有数据缓存到内存中,数据预热可以提高读取神速。
对于mysql5.0版本,方法比较简单,执行下面sql:
SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES;
对于mysql5.1版本,执行下面sql,并执行该sql的结果来进行预热:
SELECT concat('select * from ',table_schema,'.',table_name,' limit 1;') FROM information_schema.tables where engine='innodb';
对于Innodb 数据库,可以通过系统表信息,进行数据预热:
SELECT DISTINCT CONCAT('SELECT ',AB.ndxcollist,' FROM ',AB