当前位置:海洋目录网 » 站长资讯 » 站长资讯 » 文章详细 订阅RssFeed

设置多大的table_open_cache才合适?

来源:本站原创 浏览:24次 时间:2022-09-21

  我们有个分库分表的数据库系统,数据库里面大概有6000到7000张表,因为是分库分表,所以同一类的表有很多张,作用也是相同的,会被同时访问到,当时作者将数据库的table_open_cache设置成12000,已经是数据库里面表的数量的2倍了,心想table_open_cache应该已经足够大。

       但是,作者在查看数据库各线程的状态的时候,经常发现有不少线程处于open table的状态,就产生了一些怀疑,是否是数据库的设置不对,导致table cache不够用。 同时,通过命令show global status like 'Table_open_cache%' , 查看到Table_open_cache_misses 跟Table_open_cache_overflows增长的速度特别快,同时Table_open_cache_hits 值的增长速度反而没有前面两个指标高。心里一惊,难道是table_open_cache 设置太小了,还有Table_open_cache_overflows 又代表什么意义?  overflows ----超出? 为啥超出,难道table_open_cache设置的太了,但实际情况不是命中率还不够高莫?


       抱着试试看的心态,把table_open_cache调成25000,然后看一下效果,果然,table_cache的命中率有提高,但还是没有达到理想状态。继续调高,调成40000,观察后发现还有很多命中不上的情况。此时,有点心虚了,已经设置成40000了,还出现table cache 不够的情况,点解?


       一时无头绪,想知道真正的原因,看来只能看代码了。Table_open_cache_overflows 指标的异常增长让作者很是好奇,所以决定从这个入手。 然后找到下面的函数,跟这个指标有直接的关系。

    Table_cache::free_unused_tables_if_necessary

    



    我们看到使 thd->status_var.table_open_cache_overflows++ 执行的条件是:

    m_table_count > table_cache_size_per_instance && m_unused_tables


     table_cache_size_per_instance  值得意义是什么? 怎么得来的?

      继续搜索代码,找到table_cache_size_per_instance 的赋值来源,存在这样的关系。

      table_cache_size_per_instance= table_cache_size / table_cache_instances

      通过下面命令,我们可以得到table_open_cache_instances的值,默认16.

mysql> show global variables like '%table_open_cache_instances%';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| table_open_cache_instances | 16    |
+----------------------------+-------+

      于是假如table_open_cache设置成12000, table_open_cache_instances 为16, 则table_cache_size_per_instance=12000/16=750


     然后,我们再来看上面的触发overflows的等式

m_table_count > table_cache_size_per_instance && m_unused_tables


    假如m_table_count的值大于750,以及m_unused_tables 非空,就是执行remove_table(table_to_free)的操作,而且上面的条件是递归操作的条件,也就是意味则,m_unused_tables 列表中的table_cache将被清除,直至m_table_count小于或者等于table_cache_size_per_instance,导致table cache 池中的table cache数量进一步减少,产生大量的Table_open_cache_misses 与Table_open_cache_overflows


    下面是Table_cache::free_unused_tables_if_necessary的函数栈

    

  如果发现overflows的时候,会进行 remove_table(table_to_free)的操作。

   下面是remove_table的函数。


   

    正式Table_cache::add_used_table跟remove_table 函数的相结合,所以m_table_count 的值就会为维持在 table_cache_size_per_instance  以下,也就导致了实际可以保持的table_cache的数量在table_cache_size_per_instance左右。


     亲,已了解该如何设置table_open_cache的值了吗?


  推荐站点

  • At-lib分类目录At-lib分类目录

    At-lib网站分类目录汇集全国所有高质量网站,是中国权威的中文网站分类目录,给站长提供免费网址目录提交收录和推荐最新最全的优秀网站大全是名站导航之家

    www.at-lib.cn
  • 中国链接目录中国链接目录

    中国链接目录简称链接目录,是收录优秀网站和淘宝网店的网站分类目录,为您提供优质的网址导航服务,也是网店进行收录推广,站长免费推广网站、加快百度收录、增加友情链接和网站外链的平台。

    www.cnlink.org
  • 35目录网35目录网

    35目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向35目录推荐、提交优秀网站。

    www.35mulu.com
  • 就要爱网站目录就要爱网站目录

    就要爱网站目录,按主题和类别列出网站。所有提交的网站都经过人工审查,确保质量和无垃圾邮件的结果。

    www.912219.com
  • 伍佰目录伍佰目录

    伍佰网站目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向伍佰目录推荐、提交优秀网站。

    www.wbwb.net