重建缓存时,服务器会把所有的'脏'缓冲的内容先刷新到磁盘中去。之后,缓存的内容就无效了。不过,重建的时候并不阻止那些需要使用指向到缓存中的索引的查询。相反地,服务器使用本地文件系统缓存直接访问数据表索引。文件系统缓存不如索引缓存来的高效,因此,可以预见这时的查询会比较慢。一旦缓存重建完了,指向它的索引又可以使用了,同时也就不再使用文件系统缓存来访问索引了。
7.4.7 MySQL 如何统计打开的表数量
如果使用 HANDLER tbl_name OPEN 语句打开表,则有一个专用的表对象给该线程。这个表对象不和其他线程共享,并且除非调用 HANDLER tbl_name CLOSE 语句或者线程结束,否则它不会关闭;这样的话,它就重新放回表索引中(如果索引还未满)。详情请看"14.1.3 HANDLER Syntax"。
可以检查 mysqld 的状态变量 Opened_tables 来判断表索引是否太小了:
mysql> SHOW STATUS LIKE 'Opened_tables';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Opened_tables | 2741 |
+---------------+-------+
如果这个值比较大,不过完全没必要执行一大堆的 FLUSH TABLES 语句。只需加大表索引缓存大小即可。详情请看"5.2.3 Server System Variables"和"5.2.4 Server Status Variables"。
7.4.9 在一些数据库中创建太多表的缺点