MySQL配置內存使用之innodb數據字典

 
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 (第三版)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章