文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手冊頁 (TGZ) - 258.5Kb
手冊頁 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  MySQL 如何開啟和關閉表格

10.4.3.1 MySQL 如何開啟和關閉表格

當您執行 mysqladmin status 命令時,您應該會看到類似以下的資訊

Uptime: 426 Running threads: 1 Questions: 11082
Reloads: 1 Open tables: 12

如果您擁有的表格少於 12 個,則 Open tables 值為 12 可能會有些令人困惑。

MySQL 是多執行緒的,因此可能會有多個用戶端同時對給定的表格發出查詢。為了盡量減少多個用戶端連線在同一個表格上具有不同狀態的問題,每個並行連線都會獨立開啟表格。這會使用額外的記憶體,但通常會提高效能。對於 MyISAM 表格,每個開啟表格的用戶端都需要一個額外的檔案描述元來處理資料檔案。(相比之下,索引檔案描述元在所有連線之間共用。)

table_open_cachemax_connections 系統變數會影響伺服器保持開啟的檔案數量上限。如果您增加其中一個或兩個值,您可能會遇到作業系統對每個處理序開啟檔案描述元數量的限制。許多作業系統允許您增加開啟檔案的限制,但方法因系統而異。請查閱您的作業系統文件,以確定是否可以增加限制以及如何操作。

table_open_cachemax_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 會關閉未使用的資料表,並將其從資料表快取中移除:

當資料表快取填滿時,伺服器會使用下列程序來尋找要使用的快取條目:

  • 釋放目前未使用的資料表,從最近最少使用的資料表開始。

  • 如果必須開啟新的資料表,但快取已滿且沒有資料表可以釋放,則會根據需要暫時擴展快取。當快取處於暫時擴展狀態,且資料表從使用中變成未使用狀態時,該資料表會被關閉並從快取中釋放。

MyISAM 資料表會針對每個並行存取開啟。這表示如果兩個執行緒存取相同的資料表,或者如果執行緒在同一個查詢中存取資料表兩次(例如,將資料表與自身聯結),則該資料表需要開啟兩次。每個並行開啟都需要資料表快取中的一個條目。第一次開啟任何 MyISAM 資料表需要兩個檔案描述符:一個用於資料檔案,一個用於索引檔案。每次額外使用資料表只會使用資料檔案的一個檔案描述符。索引檔案描述符在所有執行緒之間共用。

如果您使用 HANDLER tbl_name OPEN 陳述式開啟資料表,則會為執行緒配置專用的資料表物件。此資料表物件不與其他執行緒共用,並且在執行緒呼叫 HANDLER tbl_name CLOSE 或執行緒終止之前不會關閉。當發生這種情況時,資料表會放回資料表快取中(如果快取未滿)。請參閱 第 15.2.5 節,「HANDLER 陳述式」

若要判斷您的資料表快取是否太小,請檢查 Opened_tables 狀態變數,該變數指示伺服器啟動以來資料表開啟操作的次數:

mysql> SHOW GLOBAL STATUS LIKE 'Opened_tables';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Opened_tables | 2741  |
+---------------+-------+

如果該值非常大或快速增加,即使您沒有發出許多 FLUSH TABLES 陳述式,請在伺服器啟動時增加 table_open_cache 的值。