共计 1967 个字符,预计需要花费 5 分钟才能阅读完成。
这篇文章主要介绍了 MySQL 中 table_cache 如何优化,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让丸趣 TV 小编带着大家一起了解一下。
table_cache 参数设置表高速缓存的数目。每个连接进来,都会至少打开一个表缓存。因此,table_cache 的大小应与 max_connections 的设置有关。例如,对于 200 个并行运行的连接,应该让表的缓存至少有 200 × N,这里 N 是应用可以执行的查询的一个联接中表的最大数量。此外,还需要为临时表和文件保留一些额外的文件描述符。
当 Mysql 访问一个表时,如果该表在缓存中已经被打开,则可以直接访问缓存;如果还没有被缓存,但是在 Mysql 表缓冲区中还有空间,那么这个表就被打开并放入表缓冲区;如果表缓存满了,则会按照一定的规则将当前未用的表释放,或者临时扩大表缓存来存放,使用表缓存的好处是可以更快速地访问表中的内容。
执行 flush tables 会清空缓存的内容。一般来说,可以通过查看运行峰值时间的状态值 Open_tables 和 Opened_tables,判断是否需要增加 table_cache 的值。其中 open_tables 是当前打开的表的数量,Opened_tables 则是已经打开的表的数量。下面我们的例子显示了这两个状态值的变化情况:
首先,清空表缓存:
flush tables;
Query OK, 0 rows affected (0.00 sec)
察看当前的表缓存情况:
mysql show global status like open%_tables;
+—————+——-+
| Variable_name | Value |
+—————+——-+
| Open_tables | 0 |
| Opened_tables | 543 |
+—————+——-+
2 rows in set (0.00 sec)
在当前连接访问一个表:
mysql select count(*) from t1;
+———-+
| count(*) |
+———-+
| 4 |
+———-+
1 row in set (0.03 sec)
mysql show global status like open%_tables;
+—————+——-+
| Variable_name | Value |
+—————+——-+
| Open_tables | 1 |
| Opened_tables | 544 |
+—————+——-+
2 rows in set (0.00 sec)
Open_tables 和 opened_tables 都增加 1。
再访问一个其他表,可以看到两个参数都增加。
mysql select count(*) from t2;
+———-+
| count(*) |
+———-+
| 1 |
+———-+
1 row in set (0.06 sec)
mysql show global status like open%_tables;
+—————+——-+
| Variable_name | Value |
+—————+——-+
| Open_tables | 2 |
| Opened_tables | 545 |
+—————+——-+
2 rows in set (0.00 sec)
再访问表 t1 的时候:
mysql select * from t1;
+——+
| id |
+——+
| 2 |
| 1 |
| 1 |
| 3 |
+——+
4 rows in set (0.02 sec)
mysql show global status like open%_tables;
+—————+——-+
| Variable_name | Value |
+—————+——-+
| Open_tables | 2 |
| Opened_tables | 545 |
+—————+——-+
2 rows in set (0.00 sec)
两个参数都没有变化,因为该表已经在表缓存中打开了,没有重复打开。
如果发现 open_tables 接近 table_cache 的时候,并且 Opened_tables 这个值在逐步增加,那就说明可能 table_cache 设置的偏小,经常需要将缓存的表清出,将新的表放入缓存,这时可以考虑增加这个参数的大小来改善访问的效率
感谢你能够认真阅读完这篇文章,希望丸趣 TV 小编分享的“MySQL 中 table_cache 如何优化”这篇文章对大家有帮助,同时也希望大家多多支持丸趣 TV,关注丸趣 TV 行业资讯频道,更多相关知识等着你来学习!