當您執行 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
的值。