top
Loading...
7.4.9.MySQL如何打開和關閉表
7.4.9. MySQL如何打開和關閉表

table_cachemax_connectionsmax_tmp_tables系統變量影響服務器保持打開的文件的最大數量。如果你增加這些值其中的一個或兩個,會遇到操作系統為每個進程打開文件描述符的數量強加的限制。許多操作系統允許你增加打開的文件的限制,盡管該方法隨系統的不同而不同。查閱操作系統文檔以確定是否可以增加限制以及如何操作。

table_cachemax_connections有關。例如,對于200個并行運行的連接,應該讓表的緩存至少有200 * N,這里N是可以執行的查詢的一個聯接中表的最大數量。還需要為臨時表和文件保留一些額外的文件描述符。

確保操作系統可以處理table_cache設置所指的打開的文件描述符的數目。如果table_cacheis設得太高,MySQL可能為文件描述符耗盡資源并拒絕連接,不能執行查詢,并且很不可靠。還必須考慮到MyISAM存儲引擎需要為每個打開的表提供兩個文件描述符。可以在mysqld_safe中使用--open-files-limit啟動選項來增加MySQL適用的文件描述符的數量。參見A.2.17節,“文件未找到”。

打開表的緩存可以保持在table_cache條。 默認為64;可以用mysqld--table_cache選項來更改。請注意 MySQL可以臨時打開更多的 表以執行查詢。

在下面的條件下,未使用的表將被關閉并從表緩存中移出:

·         當緩存滿了并且一個線程試圖打開一個不在緩存中的表時。

·         當緩存包含超過table_cache個條目,并且緩存中的表不再被任何線程使用。

·         當表刷新操作發生。當執行FLUSH TABLES語句或執行mysqladmin flush-tablesmysqladmin refresh命令時會發生。

當表緩存滿時,服務器使用下列過程找到一個緩存入口來使用:

·         當前未使用的表被釋放,以最近最少使用順序。

·         如果緩存滿了并且沒有表可以釋放,但是一個新表需要打開,緩存必須臨時被擴大。

如果緩存處于一個臨時擴大狀態并且一個表從在用變為不在用狀態,它被關閉并從緩存中釋放。

對每個并發訪問打開一個表。這意味著,如果2個線程訪問同一個表或在同一個查詢中訪問表兩次(例如,將表連接為自身時),表需要被打開兩次。每個并行的打開要求在表緩存中有一個條目。任何表的第一次打開占2個文件描述符:一個用于數據文件另一個用于索引文件。表的每一次額外使用僅占一個數據文件的文件描述符。索引文件描述符在所有線程之間共享。

如果你正用HANDLER tbl_name OPEN語句打開一個表,將為該線程專門分配一個表。該表不被其它線程共享,只有線程調用HANDLER tbl_name CLOSE或線程終止后才被關閉。表關閉后,被拉回表緩存中(如果緩存不滿)。參見13.2.3節,“HANDLER語法”。

可以通過檢查mysqld的狀態變量Opened_tables確定表緩存是否太小:

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

如果值很大,即使你沒有發出許多FLUSH TABLES語句,也應增加表緩存的大小。參見5.3.3節,“服務器系統變量”和5.3.4節,“服務器狀態變量”。

作者:mysql.com
來源:http://dev.mysql.com/doc/refman/5.1/zh/optimization.html
北斗有巢氏 有巢氏北斗