2010-02-07 98 views
10

假定數據庫由1 GB數據和1 GB索引數據組成。在內存中保存數據和索引數據 - InnoDB與MyISAM

爲了最大限度地減少磁盤IO,從而最大限度地提高性能我想分配內存到MySQL,以便包括索引在內的整個數據集可以保存在RAM中(假定機器內存豐富)。

InnoDB參數innodb_buffer_pool_size用於指定內存緩衝區的大小,InnoDB用來緩存其表中的數據和索引。 (注意:內存用於數據索引。)

MyISAM參數key_buffer_size用於指定內存緩衝區MyISAM用來緩存其表的索引的大小。 (注:使用內存ONLY的指標。)

如果我想要的2 GB的數據庫(1點GB的數據和1 GB指數)以適合InnoDB的內存下,我會簡單地配置innodb_buffer_pool_size2GB。兩千兆字節將保存數據和索引。

但是,當將MyISAM密鑰key_buffer_size設置爲2GB時,該空間將用於索引,但不用於數據。

我的問題是:

  • 能MyISAM數據的 「數據緩衝區大小」(未索引數據)被明確配置?
  • MyISAM何時從磁盤讀取表數據(不包括索引數據)以及何時從內存讀取數據?

回答

12
  • 否MyISAM沒有通用數據緩存。這是在「key_buffer_size的」文檔中講述從the official documentationThis is because MySQL relies on the operating system to perform file system caching for data reads, so you must leave some room for the file system cache.

現代的操作系統,尤其是Linux中,往往有很聰明的虛擬內存子系統,將保持經常訪問的文件在頁面緩存,所以磁盤I/O是當工作集合在可用存儲器中時保持最低限度。

  • 所以要回答你的第二個問題:從來沒有。

它不要陷入「緩衝過度規劃」也對各種MyISAM的變量,例如read_buffer_size,read_rnd_buffer_size,sort_buffer_size的值,join_buffer_size等一些是動態分配的,所以更大並不總是意味着速度是很重要的 - 有時它甚至可能會變慢 - 在mysqlperformanceblog上看到這個post爲非常有趣的情況。

如果你在一個posix平臺上運行5.1,你可能需要基於你的工作負載基準myisam_use_mmap,它應該通過減少malloc()調用的數量來幫助解決高爭用情況。