2010-03-21 29 views
7

我有一個1.9GB的MySQL innodb數據庫,顯示如下命令。將MySQL innodb數據庫加載到內存中

SELECT table_schema "Data Base Name" 
    , sum(data_length + index_length)/1 048 576 
     as "Data Base Size in MB" 
    , sum(data_free)/ 1 048 576 
     as "Free Space in MB" 
FROM information_schema.TABLES 
GROUP BY table_schema ; 

+--------------------+----------------------+------------------+ 
| Data Base Name  | Data Base Size in MB | Free Space in MB | 
+--------------------+----------------------+------------------+ 
| database_name  |  1959.73437500 | 31080.00000000 | 

我的問題是:

  1. 呢,整個數據庫可以加載到內存中,因此從磁盤讀取請求少得多,需要意思,如果我將innodb_buffer_pool_size爲2GB或更大?

  2. 31GB的可用空間是什麼意思?

  3. 如果可以分配給innodb_buffer_pool_size的最大RAM是1GB,是否可以指定將哪些表加載到內存中,同時讓其他人始終從磁盤讀取?

在此先感謝。

回答

7
  1. 不完全是。 InnoDB緩衝池用於緩衝讀取和寫入。如果大部分訪問都被讀取,大部分訪問將被緩存,並且需要更少的磁盤訪問。
  2. 可能是這個bug,它沒有被很好地記錄下來,但我認爲data_free是innodb文件裏的可用空間(如果你寫的比這個InnoDB更多,將不得不放大數據文件)。
  3. 不,但InnoDB會緩存你自動訪問的數據,所以它應該有最佳的效果。

考慮使用memcached作爲緩存層完全消除訪問數據庫,如果你需要更好的性能。

2
  1. 最好擔心有足夠的內存來緩存ram中的索引,並將數據保留在磁盤上。如果每次都必須從磁盤讀取索引,那麼數據庫性能會受到很大影響 - 遠遠超過以後從磁盤檢索所需數據的開銷。
  2. InnoDB數據文件是以固定大小創建的,如果它們滿了,可以選擇自動擴展它們(創建額外的文件)。您可以使用show variables like 'innodb_data_file_path'查看每個文件的大小。報告的可用空間是當前數據文件有多少未使用。在你的情況下,你有2gig的數據存儲在InnodB數據文件的32gig中(最有可能),剩下30gig可用。
  3. 是否有任何理由想繞過InnoDB自己的緩存邏輯在RAM中固定特定的表?緩存自然會傾向於將最常訪問的數據保存在ram中,如果強制保留使用率較低的數據而不是最受歡迎的數據,性能無疑會受到影響。