innodb有对自己每个表的缓存,被称之为表定义缓存或者数据字典,在当前版的MySQL中是不可配置的。当innodb打开一个表的时候,会将与之对应的对象添加到数据字典中。每一个表占用4KB或更多的内存(尽管在MySQL5.1中会占用更少的内存空间)。当表关闭时,这些与之对应的对象并不会从数据字典中移除。
 
随着数据字典缓存中对象的不增长,MySQL服务器会出现内存泄露的现象。但这并不是真正意义上的泄露内存;这仅仅是由于innodb没有实现任何类型的缓存过期策略。当拥有成千上万的大表时,这通常是个问题。如果这的确是个问题,你可以选择使用 Percona Server,这个分支有一个通过移除未使用的表对象来限制数据字典大小的选项。同样在MySQL5.6中也有相类似的特性。
 
另一个性能问题是第一次打开表时会为其计算统计信息,这个动作消耗大量的I/O,是非常昂贵的。相比于MyISAM,innodb不会持久的存储这些表的统计信息;第一次启动时会重新计算,在这之后,不同的时间间隔到期或相应的事件(改变表的内容,对INFORMATION_SCHEMA查询等等)也会触发这个动作。如果有大量的表,服务器会花费数个小时的时间启动和充分热身,在这段时间内,服务器可能不会处理太多的其它操作。要解决这个问题,你可以开启Percona Server的innodb_use_sys_stats_table选项(在MySQL5.6中开启 innodb_analyze_is_persistent选项)来持久存储这些表统计信息。
 
服务器启动之后,innodb统计信息操作也会对服务器或一些查询产生影响。通过关闭 innodb_stats_on_metadata选项来防止耗时的表统计信息的刷新 。但是查询 INFORMATION_SCHEMA 表中的信息时就会有很大的差异。
 
如果开启了innodb的 innodb_file_per_table 选项,对innodb能保持打开的.ibd文件的数据会有一个单独的限制。这由innodb存储引擎处理,而不是MySQL服务器,并且由innodb_open_files选项控制.innodb打开文件的方式与MyISAM不同:MyISAM使用表缓存来保存打开表的文件描述符,而在innodb中打开表和打开文件没有直接的关系。innodb为每一个.ibd文件使用一个单一的全局的文件描述符。如果你负担得起,最好将innodb_open_files设置的足够大,这样MySQL可以保持所有的.ibd文件同时处于打开状态。
 
译自:  高性能MySQL (第三版)