當您執行 mysqladmin status 命令時,您應該會看到類似這樣的結果
Uptime: 426 Running threads: 1 Questions: 11082
Reloads: 1 Open tables: 12
如果您擁有的資料表少於 12 個,則 Open tables
值為 12 可能會有些令人困惑。
MySQL 是多執行緒的,因此可能會有許多用戶端同時針對指定的資料表發出查詢。為了盡量減少多個用戶端連線在同一個資料表上具有不同狀態的問題,每個並行連線都會獨立開啟資料表。這會使用額外的記憶體,但通常會提高效能。使用 MyISAM
資料表時,每個開啟資料表的用戶端都需要一個額外的資料檔案描述元。(相比之下,索引檔案描述元在所有連線之間共享。)
table_open_cache
和 max_connections
系統變數會影響伺服器保持開啟的檔案最大數量。如果您增加其中一個或兩個值,您可能會遇到作業系統對每個程序開啟的檔案描述元數量的限制。許多作業系統允許您增加開啟檔案的限制,儘管方法因系統而異。請參閱您的作業系統文件,以確定是否可以增加限制以及如何增加。
table_open_cache
與 max_connections
相關。例如,對於 200 個並行執行連線,請指定至少為 200 *
的資料表快取大小,其中 N
N
是您執行的任何查詢中每個聯結的最大資料表數。您還必須為暫時資料表和檔案保留一些額外的檔案描述元。
請確保您的作業系統可以處理 table_open_cache
設定所暗示的開啟檔案描述元數量。如果 table_open_cache
設定得太高,MySQL 可能會耗盡檔案描述元,並出現拒絕連線或無法執行查詢等症狀。
另請注意,MyISAM
儲存引擎每個唯一開啟的資料表都需要兩個檔案描述元。若要增加 MySQL 可用的檔案描述元數量,請設定 open_files_limit
系統變數。請參閱 第 B.3.2.16 節,「找不到檔案及類似錯誤」。
開啟資料表的快取會保持在 table_open_cache
項目的層級。伺服器會在啟動時自動調整快取大小。若要明確設定大小,請在啟動時設定 table_open_cache
系統變數。MySQL 可能會暫時開啟比此更多的資料表以執行查詢,如本節稍後所述。
在下列情況下,MySQL 會關閉未使用的資料表並將其從資料表快取中移除
當快取已滿且執行緒嘗試開啟不在快取中的資料表時。
當快取包含超過
table_open_cache
個項目,且快取中的資料表不再被任何執行緒使用時。當發生表格清除操作時。這會在有人發出
FLUSH TABLES
語句,或執行 mysqladmin flush-tables 或 mysqladmin refresh 命令時發生。
當表格快取填滿時,伺服器會使用以下程序來尋找要使用的快取條目。
目前未使用的表格會被釋放,從最近最少使用的表格開始。
如果必須開啟一個新的表格,但快取已滿且無法釋放任何表格,則快取會根據需要臨時擴展。當快取處於臨時擴展狀態,且表格從使用中變為未使用狀態時,該表格會關閉並從快取中釋放。
每個並行存取都會開啟一個 MyISAM
表格。這表示如果兩個執行緒存取同一個表格,或者一個執行緒在同一個查詢中存取該表格兩次(例如,將表格自身聯結),則需要開啟該表格兩次。每個並行開啟都需要在表格快取中佔用一個條目。第一次開啟任何 MyISAM
表格需要兩個檔案描述符:一個用於資料檔案,另一個用於索引檔案。每次額外使用該表格僅需要一個資料檔案的檔案描述符。索引檔案描述符在所有執行緒之間共享。
如果您使用 HANDLER
語句開啟表格,則會為該執行緒分配一個專用的表格物件。這個表格物件不會被其他執行緒共享,並且在執行緒呼叫 tbl_name
OPENHANDLER
或執行緒終止之前不會關閉。當這種情況發生時,表格會放回表格快取中(如果快取未滿)。請參閱第 15.2.5 節,“HANDLER 語句”。tbl_name
CLOSE
若要判斷您的表格快取是否太小,請檢查 Opened_tables
狀態變數,該變數表示伺服器啟動以來表格開啟操作的次數。
mysql> SHOW GLOBAL STATUS LIKE 'Opened_tables';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Opened_tables | 2741 |
+---------------+-------+
如果該值非常大或快速增加,即使您沒有發出許多 FLUSH TABLES
語句,也請在伺服器啟動時增加 table_open_cache
值。