官網解釋參見:https://dev.mysql.com/doc/refman/5.7/en/table-cache.html 其他可供參考的文章有: 關於表限制參數的使用:https://dba.stackexchange.com/questions/5232/mysql-table-cache- ...
官網解釋參見:https://dev.mysql.com/doc/refman/5.7/en/table-cache.html 其他可供參考的文章有: 關於表限制參數的使用:https://dba.stackexchange.com/questions/5232/mysql-table-cache-and-opened-tables 關於SHOW OPEN TABLES命令的使用:https://www.percona.com/blog/2008/12/14/show-open-tables-what-is-in-your-table-cache/ 一、本文涉及到的系統參數有3個:
- table_open_cache
這是個server層的參數,mysql不支持並行查詢,mysql的會話也沒有PGA的概念,一個thread引用myisam表時需要在server層上創建一個table對象(索引也需要創建一個但是是共用的,self join會創建2個,分區表每個分區按單表對待),如果同時多個會話引用一個表也會創建多個表對象,雖然會加大記憶體使用量,但是卻極大的減少了內部表鎖的爭用。 這個值的數目建議設置為max_connections*你的表數目,當然你可能也需要為一些臨時表等對象預留,但是這個數目已經足夠大啦。 那麼mysql什麼時候釋放這些表對象呢?
- 當緩衝已滿,而連接想要打開一個不在緩衝中的表時。
- 當緩衝數目已經超過了table_open_cache設置的值,mysql開始使用LRU演算法釋放表對象。
- 當你用flush tables;語句時。
- open_files_limit
- innodb_open_files
flush tables:close了server層創建的所有的table_share和table,當然innodb層中指向table對象的handler也就無用了。